Реализация функций с помощью очень простых сценариев

Я некоторое время играл с 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

(EDIT)Я решил использовать эту попытку как вдохновение и начать работу над этим проектом с нуля. (Надеюсь, я найду какое-то реальное время, чтобы сесть и написать код, прежде чем классы снова начнутся.) Я намерен наградить лучшим ответом через несколько дней . Я надеюсь, что эта информация не отговорит потенциальных участников от предоставления чего-либо, что, по их мнению, может быть полезным для решения такого рода проблем с кодированием.

17
задан motoku 16 July 2011 в 22:22
поделиться