In case anyone's interested, and because this probably doesn't warrent its own thread, here's a Python implementation of Brainf*ck:
import sys
class Commands(type):
def __new__(cls, name, bases, members):
members['commands'] = dict(
(m.__doc__, m) for m in members.values() if m.__doc__
)
return type.__new__(cls, name, bases, members)
class Interpreter:
__metaclass__ = Commands
def __init__(self, file):
self.code = [c for c in file.read() if c in self.commands.keys()]
self.memory = {}
self.pointer = 0
self.instr = 0
def run(self):
while self.instr < len(self.code):
self.commands[self.code[self.instr]](self)
self.instr += 1
def inc(self):
">"
self.pointer += 1
def dec(self):
"<"
self.pointer -= 1
def inc_value(self):
"+"
try:
self.memory[self.pointer] += 1
except:
self.memory[self.pointer] = 1
def dec_value(self):
"-"
try:
self.memory[self.pointer] -= 1
except:
self.memory[self.pointer] = -1
def output(self):
"."
sys.stdout.write(chr(self.memory[self.pointer]))
def input(self):
","
self.memory[self.pointer] = ord(sys.stdin.read(1))
def start_loop(self):
"["
if self.memory[self.pointer] == 0:
self.instr = self.code.index("]", self.instr) + 1
def end_loop(self):
"]"
if self.memory[self.pointer] != 0:
for i in xrange(self.instr, 0, -1):
if self.code[i] == "[":
self.instr = i
break
if __name__ == '__main__':
Interpreter(sys.stdin).run()