Stack-based

Stack-based is a stack-based esolang invented by User:None1.
==Commands==
They are case-insensitive.
Legend: x, y and z are variables, integer is an integer literal, string is a string literal without quotes.
===Declaration===
 VAR x
Declare a variable named x with initial value 0. All values in this esolang are unsigned bignums.
===I/O===
EOF returns 0 in all input commands.
 I x
Input x as decimal.
 O x
Output x as decimal.
 IC x
Input x as Unicode.
 OC x
Output x as Unicode.
 P "string"
Output string (escape is not allowed).
===Arithmetic===
 S x integer
Store integer in x.
 A x y z
Let z be x+y.
 SU x y z
Let z be x-y.
 M x y z
Let z be x*y.
 Q x y z
Let z be the quotient of x/y.
 R x y z
Let z be the remainder of x/y.
 C x y
Let y be x.
===Stack operations===
 PUSH x
Push x onto the stack.
 POP x
Pop stack and store in x.
 POP
Pop stack and discard.
 TOP x
Store top of stack to x.
 SZ x
Store number of elements in the stack to x.
===Comparison===
 LT x y z
Set z to 1 if x < y, otherwise 0.
 LE x y z
Set z to 1 if x <= y, otherwise 0.
 GT x y z
Set z to 1 if x > y, otherwise 0.
 GE x y z
Set z to 1 if x >= y, otherwise 0.
 EQ x y z
Set z to 1 if x = y, otherwise 0.
 NE x y z
Set z to 1 if x != y, otherwise 0.
===Jump===
 JA x integer
Jump integer commands forward if x is nonzero.
 JB x integer
Jump integer commands backward if x is nonzero.
 NOP
NOP.
 HALT
Quit.
===Random===
 RND x
Randomize x to integer between 0 and 1.
===Logic operations===
 AND x y z
Let z be 1 if x and y are both nonzero, otherwise 0.
 OR x y z
Let z be 0 if x and y are both zero, otherwise 1.
 NOT x y
Let y be 1 if x is zero, otherwise 0.
===Bitwise operations===
 BND x y z
Let z be the bitwise AND result of x and y.
 BOR x y z
Let z be the bitwise OR result of x and y.
 XOR x y z
Let z be the bitwise XOR result of x and y.
===Comments===
Like most assembly-like languages, Stack-based uses ; as comments, comments comment until the next line and are not parsed or executed.
 code ; comment
 more code
===Errors===
 Syntax error
When the syntax is invalid.
 Undefined variable
When you attempt to use an undefined variable.
 Division error
Division by 0 (modulo by 0 returns 0 in this esolang, so it won't raise an error).
 Negative error
When attempting to create a negative value.
 Empty error
When popping or accessing top of stack when the stack is empty.
===Example programs===
====Hello World!====
 P "Hello World!"
====Cat program====
 VAR x
 IC x
 OC x
 JB x 2
Bug: Prints an extra NUL character in the end, which is visible in online interpreter. Please try to fix it.
====A+B Problem====
 VAR x
 I x
 VAR y
 I y
 VAR z
 A x y z
 O z
====Truth Machine====
 VAR x
 I x
 O x
 JB x 1
====Fibonacci====
 VAR x
 VAR y
 VAR z
 VAR i
 S x 0
 S y 1
 S i 1
 O x
 A x y z
 C y x
 C z y
 JB i 4
====Reverse Cat program====
 VAR x
 IC x
 PUSH x
 JB x 2
 VAR y
 VAR z
 SZ y
 NOT y z
 JA z 3
 POP x
 OC x
 JB y 5
Bug: Prints an extra NUL character in front, which is visible in online interpreter. Please try to fix it.
====looping counter====
 VAR x
 VAR y
 VAR z
 VAR one
 S x 1
 S one 1
 S z 10
 C x y
 P "*"
 SU y one y
 JB y 2
 OC z
 A x one x
 JB one 6
========
 VAR four
 S four 4
 O four
====Coin====
 VAR x
 RND x
 JA x 3
 P "Tails"
 HALT
 P "Heads"
==Turing completeness==
A conversion from BinaryLanguage is possible, so it is Turing complete.
==External resources==
* Official interpreter in Python.
* Online interpreter based on the official interpreter.
==See also==
* Stack-based+
Category:Languages
Category:Stack-based
Category:Push-down automata
Category:Turing complete
Category:2023
Category:Implemented