Forth
@Alfons Mittelmeyer: Anmerkungen zum Code:
Wenn ich ein Interpreter-Objekt habe, würde ich nicht davon ausgehen, dass daneben noch eine Menge globaler Variablen existieren, und es nur einen Interpreter geben kann. Da ist nämlich die Interpreter-Klasse gar keine, sondern eine einfache Funktion. Klassenattribute sind kein Ersatz für Instanzattribute, die Klassenattribute bei IP und Interpreter sollten eigentlich Instanzattribute sein und in __init__ gesetzt werden.
Das ganze mal objektorientiert:
Wenn ich ein Interpreter-Objekt habe, würde ich nicht davon ausgehen, dass daneben noch eine Menge globaler Variablen existieren, und es nur einen Interpreter geben kann. Da ist nämlich die Interpreter-Klasse gar keine, sondern eine einfache Funktion. Klassenattribute sind kein Ersatz für Instanzattribute, die Klassenattribute bei IP und Interpreter sollten eigentlich Instanzattribute sein und in __init__ gesetzt werden.
Das ganze mal objektorientiert:
Code: Alles auswählen
import sys
class Interpreter:
def __init__(self, code, functions=None):
self.code = code
self.functions = functions
self.ip = 0
self.running = False
self.stack = []
self.returnstack = []
self.loopstack = []
def next_code(self):
self.ip += 1
return self.code[self.ip - 1]
def run(self):
self.running = True
while self.running:
try:
command = self.next_code()
except IndexError:
if not self.returnstack:
break
self.code, self.ip = self.returnstack.pop()
else:
getattr(self, 'cmd_' + command)()
def cmd_abort(self):
self.running = False
def cmd_semis(self):
self.code, self.ip = self.returnstack.pop()
def cmd_lit(self):
self.stack.append(self.next_code())
def cmd_output(self):
sys.stdout.write('{}'.format(self.stack.pop()))
def cmd_emit(self):
sys.stdout.write(chr(self.stack.pop()))
def cmd_do(self):
self.loopstack.append([self.stack.pop(), self.stack.pop(), self.ip])
def cmd_i(self):
self.stack.append(self.loopstack[-1][0])
def cmd_loop(self):
self.loopstack[-1][0] += 1
cur, end, ip = self.loopstack[-1]
if cur < end:
self.ip = ip
else:
self.loopstack.pop()
def cmd_call(self):
function = self.functions[self.next_code()]
self.returnstack.append((self.code, self.ip))
self.code = function
self.ip = 0
code_nl = ('lit','\n','output','semis')
code = ('lit',96,'lit',65,'do','i','output','lit',' ','output','i','emit','call', 'nl', 'loop','abort')
interpreter = Interpreter(code, {'nl': code_nl})
interpreter.run()
Code: Alles auswählen
def cmd_output(self):
sys.stdout.write('{}'.format(self.stack.pop()))
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
Aus einem anderem Thread geht hervor, das jan.b einen Raspi hat. Bei Raspi-Neulingen und auch Nutzern ist die Motivation, Python vernünftig zu lernen, gerne eher gering. Sieht man auch immer wieder in diversen Threads im deutschen Raspi-Forum...Entweder Troll oder er ist noch sehr jung, dass er so komisch schreibt.
*fg* Ich bin auch für einen VaterschaftstestVielleicht ist er auch das Kind von Alfons Mittelmeyer.
Gruß, noisefloor