He estado jugando con python durante algún tiempo y he decidido mejorar mi comprensión generalizada de los lenguajes de programación escribiendo un controlador de scripts personalizado en python. Hasta ahora he implementado con éxito un manejador de memoria básico y enganché una dirección de memoria ordenada para imprimir en la pantalla. Mi pregunta puede formularse como:Implementación de funciones con scripting muy básico
¿Cómo se pueden implementar las funciones aquí? Una declaración goto es demasiado fácil, me gustaría intentar algo más difícil. (Editar) Finalmente Quiero ser capaz de hacer:
f0(x, y, z):=ax^by^cz
... en una cáscara que ejecuta un script que se ejecuta este módulo (tonto, ¿eh?)
# 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())
un script de ejemplo:
mov 1
put 104.101.108.108.111.10
mov 0
ref 1
clr 0
(EDIT) He tomado la decisión de utilizar este intento como inspiración y comenzar de cero en este proyecto. (Espero encontrar algún tiempo real para sentarse y programar antes de que las clases comiencen de nuevo.)
Tengo la intención de otorgar la mejor respuesta en unos pocos días
. Espero que esa información no disuada a los contribuyentes potenciales de enviar algo que consideren útil para este tipo de problema de codificación.
Creo que debe ser más específico que simplemente "funciones básicas de entrada/salida", pero básicamente parece que podría hacer lo que sea de la misma manera que ha hecho todo lo demás ... es decir. agregue uno o más comandos a su intérprete. – martineau
Reemplacé esa pregunta con una mejor (más específica). – motoku
@Sean Pedersen Será más fácil responder si muestra cómo debe comportarse (algunas pruebas de acción real, aprobadas o fallidas). – DrTyrsa