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 the whole script into single-line. It can be simply referred to as a "memory block".
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 | 
|---|---|
[(block of code)[or ](block of code)] | 
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
- Scratch
 - Limitation: Scratch only uses 64-bit numerals, which means the numbers could only range from -9223372036854775807 to 9223372036854775807. Undefined behavior will occur at overflow.