Estoy implementando una versión rudimentaria de LISP en Ruby solo para familiarizarme con algunos conceptos. Estoy basando mi implementación en Lispy de Peter Norvig (http://norvig.com/lispy.html).Ayúdame a escribir mi LISP :) Entornos LISP, Ruby Hashes
Hay algo que me falta aquí, sin embargo, y te agradecería un poco de ayuda ...
Él subclases dict del pitón de la siguiente manera:
class Env(dict):
"An environment: a dict of {'var':val} pairs, with an outer Env."
def __init__(self, parms=(), args=(), outer=None):
self.update(zip(parms,args))
self.outer = outer
def find(self, var):
"Find the innermost Env where var appears."
return self if var in self else self.outer.find(var)
Luego pasa a explicar por qué hace esto en lugar de solo usar un dict. Sin embargo, por alguna razón, su explicación sigue pasando a través de mis ojos y fuera de mi cabeza.
Por qué no utilizar un dict, y luego dentro de la función eval, cuando se necesita crear un nuevo "subentorno", simplemente tome el dict existente y actualice los pares de clave/valor que necesitan actualizarse, y pase esa nueva ley en la próxima evaluación?
¿El intérprete de Python no hará un seguimiento de los envs "externos" anteriores? ¿Y la naturaleza de la recursión no garantizará que los valores se extraigan de "interno" a "externo"?
Estoy usando Ruby, y traté de implementar las cosas de esta manera. Algo no funciona, y podría ser por esto, o tal vez no. Aquí está mi función eval, siendo env un hash normal:
def eval(x, env = $global_env)
........
elsif x[0] == "lambda" then
->(*args) { eval(x[2], env.merge(Hash[*x[1].zip(args).flatten(1)])) }
........
end
La línea de que los asuntos de curso es el "lambda" uno.
Si hay una diferencia funcional, ¿qué hay de diferente entre lo que estoy haciendo aquí y lo que hizo Norvig con su clase Env? ¿Puede alguien describirme un caso en el que los dos se desviarán?
Si no hay diferencia, entonces quizás alguien me pueda aclarar por qué Norvig usa la clase Env. Gracias :)
¡La mejor forma de entender Scheme es implementar Scheme! – erjiang
Oh, tan cierto ... :) – MikeC8