SideStacks

From Esolang
Jump to navigation Jump to search

SideStacks is a Stack-Based programming language made by User:Myoitzi housing two stacks and two 8-bit registers.

Instruction set

SideStacks uses a multitude of Single-character instructions, similar to brainfuck. A list of instructions is provided below:

Command Description
^ Increment the "A" register.
v Decrement the "A" register.
< Push the value of the "A" register to the selected stack and set "A" to 0.
> Pop the topmost value of the selected stack to "A".
+ Pop the topmost value of the selected stack and add it to "A".
- Pop the topmost value of the selected stack and subtract it from "A".
s Swap the values of the "A" register with the "B" register and vice versa.
b Duplicate the value of the "A" register and store it into the "B" register.
. Print the "A" register as a decimal number.
@ Print the "A" register as an ASCII character.
; Take an integer input and store it into "A".
: Take an ASCII input and store it's corresponding value into "A".
0 Set "A" to 0.
( Jump past corresponding parentheses if "A" is 0 (similar to [ in brainfuck).
) Jump back to the corresponding parentheses if "A" is nonzero (similar to ] in brainfuck).
[ Jump past corresponding parentheses if the "A" is nonzero.
] Jump back to the corresponding parentheses if "A" is 0.
{ Jump past corresponding parentheses if the "A" is equal to "B".
} Jump back to the corresponding parentheses if "A" is not equal to "B".
f Flip selected stack.

Any character not in this table will be ignored

Examples

Hello World!:

^^^^b<s+b<s+b<sb<sb<s+++^^^^^^^^@b<s<^^^b<s+^b<s+b<s+^+@^^^^^^^@
@^^^@0^^^^b<s+b<s+b<s+@0^^^^b<s+b<s+v+@<^^^^b<s+b<sb<s+++@^^^@vv
vvvv@vvvvvvvv@0^^^^b<s+b<s+b<s+^@

Cat:

:@

Truth Machine: (Note: will repeat for any nonzero value)

;(.).

99 Bottles of Beer

^^^^^^^^^^^b<sb<s++b<sb<s++f<f^^^^^^^^b<s+b<s+b<sb<s++<f>(.<f>b<s^^@>b<s<^^^^^^^^b<s+v+@^^^^^@@>b<s<^^^^^^^^^^^^+@vvvvv
vv@<^^^^^^^b<s++@0^^^^^^^^b<s+b<s+@>b<s<^^^^^^^^b<s+v+@>b<s^^^^^^@0^^^^^^^^b<s+b<s+@>b<s^^@^^^@@<^^^^b<sb<s+++^@0^^^^^^
^^b<s+b<s+@>b<s<^^^^^^^^b<s+v+@v@0^^^^^^^^b<s+b<s+@>b<s<^^^^^b<s+b<s++@vvvvvvvvvvvv@vvv@0^^^^^^^^b<s+b<s+@>b<s<^^^^^^^b
<sb<s+++^^@>b<s^@v<^^^^b<sb<s+++@@0^^^^^^^^b<s+b<s+^^^^^^^^^^^^@0^^^^^b<s+@f>.<f>b<s^^@>b<s<^^^^^^^^b<s+v+@^^^^^@@>b<s<
^^^^^^^^^^^^+@vvvvvvv@<^^^^^^^b<s++@0^^^^^^^^b<s+b<s+@>b<s<^^^^^^^^b<s+v+@>b<s^^^^^^@0^^^^^^^^b<s+b<s+@>b<s^^@^^^@@<^^^
^b<sb<s+++^@0^^^^^^^^b<s+b<s+^@0^^^^^b<s+@>b<svvvvvvvvvvvv@>b<s^@^^^^^^^^^^@vvvvvv@0^^^^^^^^b<s+b<s+@>b<s<^^^^^^^^b<s+v
+@v@vvvvvvvvv@0^^^^^^^^b<s+b<s+@>b<s^^^^@<^^^^^b<s+^+@b<s^^^^^^^^@>v@0^^^^^^^^b<s+b<s+^^^^^^^^^^^^@0^^^^^^^^b<s+b<s+@>b
<s<^^^^^^^^b<s+v+^@>b<s^@<^^^^^^^^^b<s++@@0^^^^^^^^b<s+b<s+@>b<s^^^^^^^^^@^^^^^^^^^^^@0^^^^^^^^b<s+b<s+@>b<s^@<^^^^^^^^
b<s+^+@vvv@^^^^^^@vvvvvvv@>b<s^^^^@0^^^^^^^^b<s+b<s+^^^^^^^^^^^^@0^^^^^b<s+@f>v.<f>b<s^^@>b<s<^^^^^^^^b<s+v+@^^^^^@@>b<
s<^^^^^^^^^^^^+@vvvvvvv@<^^^^^^^b<s++@0^^^^^^^^b<s+b<s+@>b<s<^^^^^^^^b<s+v+@>b<s^^^^^^@0^^^^^^^^b<s+b<s+@>b<s^^@^^^@@<^
^^^b<sb<s+++^@0^^^^^^^^b<s+b<s+@>b<s<^^^^^^^^b<s+v+@v@0^^^^^^^^b<s+b<s+@>b<s<^^^^^b<s+b<s++@vvvvvvvvvvvv@vvv@0^^^^^^^^b
<s+b<s+@>b<s<^^^^^^^b<sb<s+++^^@>b<s^@v<^^^^b<sb<s+++@@0^^^^^^^^b<s+b<s+^@0^^^^^b<s+@0^^^^^b<s+@f>)

Implementation

Python 3:

stack = [] 
stack2 = []
a = 0 
b = 0
sp = 1
ins = ':@'
i = 0
debug = False
while i < len(ins):
   if ins[i]  ==  'd':
       if debug == False:
           debug = True
       else:
           debug = False
   elif ins[i] == '^':
       a += 1
       if debug == True:
           print(f'\na = {a}')
   elif ins[i] == 'v':
       a -= 1
       if debug == True:
           print(f'\na = {a}')
   elif ins[i] == '<':
       if sp == 1:
           stack.append(a)
       else:
           stack2.append(a)
       a = 0
       if debug == True:
           print(f'\nStack: {stack}')
           print(f'\nStack2: {stack2}')
   elif ins[i] == '>':
       if sp == 1:
           a = stack.pop()
       else:
           a = stack2.pop()
       if debug == True:
           print(f'\na = {a}')
           print(f'\nStack: {stack}')
           print(f'\nStack2: {stack2}')
   elif ins[i] == '+':
       if sp == 1:
           a += stack.pop()
       else:
           a += stack2.pop()
       if debug == True:
           print(f'\na = {a}')
           print(f'\nStack: {stack}')
           print(f'\nStack2: {stack2}')
   elif ins[i] == '-':
       if sp == 1:
           a -= stack.pop()
       else:
           a -= stack2.pop()
       if debug == True:
           print(f'\na = {a}')
           print(f'\nStack: {stack}')
           print(f'\nStack2: {stack2}')
   elif ins[i] == '.':
       print(a, end=' ')
   elif ins[i] == '@':
       print(chr(a), end="")
   elif ins[i] == 'b':
       b = a
   elif ins[i] == 's':
       stack.append(a)
       a = b
       b = stack.pop()
   elif ins[i] == ';':
       print()
       a = int(input('> '))
   elif ins[i] == ':':
       print()
       a = ord(input('> '))
   elif ins[i] == '0':
       a = 0
   elif ins[i] == ')':
       if a != 0:
           i -= 1
           loop = 1
           while loop > 0:
               if ins[i] == ')' or ins[i] == ']' or ins[i] == '}':
                   loop += 1
                   i -= 1
               elif ins[i] == '(' or ins[i] == '[' or ins[i] == '{':
                   loop -= 1
                   if loop != 0:
                       i -= 1
               else:
                   i -=1
   elif ins[i] == ']':
       if a == 0:
           i -= 1
           loop = 1
           while loop > 0:
               if ins[i] == ')' or ins[i] == ']' or ins[i] == '}':
                   loop += 1
                   i -= 1
               elif ins[i] == '(' or ins[i] == '[' or ins[i] == '{':
                   loop -= 1
                   if loop != 0:
                       i -= 1
               else:
                   i -=1
   elif ins[i] == '}':
       if a != b:
           i -= 1
           loop = 1
           while loop > 0:
               if ins[i] == ')' or ins[i] == ']' or ins[i] == '}':
                   loop += 1
                   i -= 1
               elif ins[i] == '(' or ins[i] == '[' or ins[i] == '{':
                   loop -= 1
                   if loop != 0:
                       i -= 1
               else:
                   i -=1
   elif ins[i] == '(':
       if a == 0:
           i += 1
           loop = 1
           while loop > 0:
               if ins[i] == '(' or ins[i] == '[' or ins[i] == '{':
                   loop += 1
                   i += 1
               elif ins[i] == ')' or ins[i] == ']' or ins[i] == '}':
                   loop -= 1
                   if loop != 0:
                       i += 1
               else:
                   i +=1
   elif ins[i] == '[':
       if a != 0:
           i += 1
           loop = 1
           while loop > 0:
               if ins[i] == '(' or ins[i] == '[' or ins[i] == '{':
                   loop += 1
                   i += 1
               elif ins[i] == ')' or ins[i] == ']' or ins[i] == '}':
                   loop -= 1
                   if loop != 0:
                       i += 1
               else:
                   i -=1
   elif ins[i] == '{':
       if a == b:
           i += 1
           loop = 1
           while loop > 0:
               if ins[i] == '(' or ins[i] == '[' or ins[i] == '{':
                   loop += 1
                   i += 1
               elif ins[i] == ')' or ins[i] == ']' or ins[i] == '}':
                   loop -= 1
                   if loop != 0:
                       i += 1
               else:
                   i +=1
   elif ins[i] == 'f':
       if sp == 1:
           sp = 2
       else:
           sp = 1
   while a > 255 or a < 0:
       if a >= 256:
           a %= 256
       elif a < 0:
           a = (a % 256)+256
   i += 1