Я некоторое время играл с python и решил улучшить свое общее понимание языков программирования, написав собственный обработчик сценариев на python.До сих пор я успешно реализовал базовый обработчик памяти и подключил ординату адреса памяти к печати на экране.Мой вопрос можно сформулировать так:
Как здесь реализовать функции?Утверждение goto слишком просто, я хотел бы попробовать что-то более сложное.(редактировать) В конце концов я хочу иметь возможность:
f0(x, y, z):=ax^by^cz
... в оболочке, которая запускает скрипт, который запускает этот модуль (глупо, а?)
# notes: separate addresses from data lest the loop of doom cometh
class Interpreter:
def __init__(self):
self.memory = { }
self.dictionary = {"mov" : self.mov,
"put" : self.put,
"add" : self.add,
"sub" : self.sub,
"clr" : self.clr,
"cpy" : self.cpy,
"ref" : self.ref }
self.hooks = {self.val("0") : self.out }
def interpret(self, line):
x = line.split(" ")
vals = tuple(self.val(y) for y in x[1:])
dereferenced = []
keys_only = tuple(key for key in self.memory)
for val in vals:
while val in self.memory: val = self.memory[val]
dereferenced.append(val)
vals = tuple(y for y in dereferenced)
self.dictionary[x[0]](vals)
def val(self, x):
return tuple(int(y) for y in str(x).split("."))
def mov(self, value):
self.ptr = value[0]
def put(self, value):
self.memory[self.ptr] = value[0]
def clr(self, value):
if self.ptr in self.hooks and self.ptr in self.memory:
x = self.hooks[self.ptr]
y = self.memory[self.ptr]
for z in y: x(z)
del self.memory[self.ptr]
def add(self, values):
self.put(self.mat(values, lambda x, y: x + y))
def sub(self, values):
self.put(self.mat(values, lambda x, y: x - y))
def mat(self, values, op):
a, b = self.memory[values[0]], self.memory[values[1]]
if len(a) > len(b): a, b = b, a
c = [op(a[x], b[x]) for x in xrange(len(b))] + [x for x in a[len(a):]]
return [tuple(x for x in c)]
def cpy(self, value):
self.put(value)
def out(self, x):
print chr(x),
def ref(self, x):
self.put(x)
interp = Interpreter()
for x in file(__file__.split('/')[-1].split(".")[-2] + ".why"):
interp.interpret(x.strip())
пример сценария:
mov 1
put 104.101.108.108.111.10
mov 0
ref 1
clr 0
(РЕДАКТИРОВАТЬ) Я принял решение использовать эту попытку в качестве вдохновения и начать с нуля в этом проекте.(Надеюсь, я найду немного реального времени, чтобы сесть и написать код, прежде чем занятия начнутся снова.) Я собираюсь наградить лучший ответ через несколько дней .Я надеюсь, что эта информация не сможет отговорить потенциальных участников представить что-либо, что, по их мнению, будет полезно для такого рода проблем с кодированием.