Skip to content

Instantly share code, notes, and snippets.

@stillwwater
Created April 14, 2018 17:46
Show Gist options
  • Save stillwwater/d603f6a0059e1ab5b50703762a58b7f2 to your computer and use it in GitHub Desktop.
Save stillwwater/d603f6a0059e1ab5b50703762a58b7f2 to your computer and use it in GitHub Desktop.
import sys
import itertools
class Smol:
def __init__(self, tapesize=1):
self.env = {
'+': lambda: self.incdec(1, 0),
'-': lambda: self.incdec(-1, 0),
'>': lambda: self.incdec(0, 1),
'<': lambda: self.incdec(0, -1),
'.': lambda: print(self.tape[self.pointer], end=' '),
';': lambda: print(chr(self.tape[self.pointer]), end=''),
',': lambda: self.incdec(int(input('\n%d? ' % self.pointer)) - self.tape[self.pointer], 0),
'[': lambda: self.loop(True),
']': lambda: self.loop(False)
}
self.tape = [0 for x in range(tapesize)]
self.jmp_stack = [] # remembers positions on tape
self.pointer = 0
self.pc = 0
def run(self, program):
while self.pc < len(program):
self.env[program[self.pc]]()
self.pc += 1
def incdec(self, tape_inc, pointer_inc):
self.pointer += pointer_inc
if self.pointer >= len(self.tape): self.tape.append(0)
self.tape[self.pointer] += tape_inc
if self.tape[self.pointer] < 0: self.tape[self.pointer] = 0
def loop(self, open):
if open: self.jmp_stack.append(self.pc) # save tape position
elif self.tape[self.pointer] == 0: self.jmp_stack.pop() # forget saved position
else: self.pc = self.jmp_stack[-1] # jmp to saved position at the top
def __str__(self):
return str(self.tape)
smol = Smol()
print('\n--smol interpreter--\n\nvalid instructions: {}\n'.format([k for k in smol.env]))
smol.run([c for c in list(itertools.chain.from_iterable(open(sys.argv[1], 'rU'))) if c in smol.env])
print(smol)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment