Soallang

From Esolang
Jump to navigation Jump to search
Soallang
Paradigm(s) stack-driven
Designed by HungKhanh0106
Appeared in 2022
Memory system Stack-based
Dimensions one-dimensional
Computational class Turing complete
Reference implementation Scratch
Influenced by Piet
Scratch
Volatile
File extension(s) .sl

Soallang is a stack-based esoteric programming language designed by HungKhanh0106 (talk).

Data structure

Soallang's only data structure is a dynamic block containing either a string, an integer or a floating-point number. It is required to be enclosed using quotation marks for convenience since interpreters will be determined to bundle a whole script into single-line (see § Commands). It can be simply referred to as a "memory block".

64-bit numerals

There is an optional criterion for memory blocks that can be implemented, which is 64-bit numerals. In case of that, numbers can only range from -9223372036854775807 to 9223372036854775807, in which an undefined behaviour will occur at overflow.

Error detection

For Soallang, errors that are syntactically- and statement disclosure-related are required to be announced at runtime (excluding compilers). Meanwhile, segmentation faults relating to stack access (TL;DR stack out-of-bounds) are required to be omitted. Any other errors are considered of undefined behaviour.

Commands

Soallang commands are executed from left to right, character by character. It is noted that multi-lined scripts may be stacked upon a line while retaining its full context (for interpreters). Currently, there are 19 commands and 1 initialiser.

Instruction Pseudo-code
[" or '](to be written)[" or '] Push
~ Pop
+/a Add
-/s Subtract
*/m Multiply
//d Subtract
%/r Modulo
& And
| Or
\ Xor
! Not
> Greater
< Lower
= Equal
$ Swap
] Jump past if
[ Jump back if
^ Fore
: Duplicate
, Roll
i Input
o Output

Usage

  • Push: Pushes a block of memory onto the stack.
  • Pop: Pops the top value off the stack.
  • Add: Pops the top two blocks off the stack, sums them up, then pushes the result back onto the stack.
  • Subtract: Pops the top two blocks off the stack, subtracts the top value from the second-top value, and pushes the difference back onto the stack. Note that if the top block contains x and the next block is y, this means that y ÷ x will be pushed, not x ÷ y.
  • Multiply: Pops the top two values off the stack, multiplies them together, and pushes the product back onto the stack.
  • Divide: Pops the top two values off the stack, performs division on the second-to-top value divided by the top value, and pushes the quotient back onto the stack. This has the same stack evaluation order as Subtraction.
  • Modulo: Pops the top two blocks off the stack, divides the second-top value by the top value, and pushes the remainder back onto the stack. This has got the same stack evaluation order as Subtraction.
  • Not: Pops the top value off the stack. If the value is 0, it pushes 1 onto the stack. Otherwise, it pushes 0.
  • Lower: Pops the top two blocks off the stack. If the second-top value is lower than the top value, it pushes 1 onto the stack. Otherwise, it pushes 0. This has the same stack evaluation order as Subtraction.
  • Greater: Pops the top two blocks off the stack. If the second-top value is greater than the top value, it pushes 1 onto the stack. Otherwise, it pushes 0. This has the same stack evaluation order as Subtraction.
  • Equal: Pops the top two blocks off the stack. If the second-top value is equal to the top value, it pushes 1 onto the stack. Otherwise, it pushes 0. This has the same stack evaluation order as Subtraction.
  • Swap: Pops the top two blocks off the stack, orders back the top value to before the second-top value.
  • Jump past if: Jumps past the next ']' if the top value is non-zero.
  • Jump back if: Jump back to the previous '[' if the top value is non-zero.
  • Fore: Directs the interpreter back to the previous command if the top value is non-zero.
  • Duplicate: Pushes a copy of the top value onto the stack.
  • Roll: Pops the top two values off the stack, and then rotates the top Y values on the stack up by X, wrapping values that pass the top around to the bottom of the rolled portion, where X is the first value popped (top of the stack), and Y is the second value popped (second on the stack). (Example: If the stack is currently {1, 2, 3}, with 3 at the top, and then you push 3 and then 1, and then roll, its result will be {3, 2, 1}.)
  • Input: Takes a user input, then pushes it onto the stack.
  • Output: Pops the top value off the stack then prints it.

Examples

Hello, world!

"Hello, world!"o

Cat program

io

Truth-machine

''i!]![~'1':o[]

99 bottles of beer

'100'['1's:::' bottles of beer.'+,' bottles of beer on the wall,'+,$
'Take one down, pass it around,'$'1's:'0'=]~' bottles of beer on the wall.'
+'',o$o$o$o$o:'1'-~[]~~~,$~,'No bottles of beer on the wall.',oooo$~

Implementations