【发布时间】:2011-01-12 04:44:43
【问题描述】:
我正在用 Ruby 实现 LISP 的初级版本,只是为了让自己熟悉一些概念。我的实现基于 Peter Norvig 的 Lispy (http://norvig.com/lispy.html)。
我在这里缺少一些东西,我会很感激一些帮助......
他将 Python 的 dict 子类化如下:
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)
然后他继续解释他为什么这样做,而不仅仅是使用字典。然而,由于某种原因,他的解释不断地从我的眼睛里闪过,又从我的脑后传出来。
为什么不使用dict,然后在eval函数内部,当需要创建新的“子环境”时,只需获取现有的dict并更新需要更新的键/值对,然后传递新的字典进入下一个评估?
Python 解释器不会跟踪以前的“外部”环境吗?并且递归的性质不会确保将值从“内部”拉到“外部”吗?
我正在使用 Ruby,并尝试以这种方式实现。但是有些东西不起作用,可能是因为这个,也可能不是。这是我的 eval 函数, env 是一个常规哈希:
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
当然重要的是“lambda”行。
如果存在功能上的差异,那么我在这里所做的与 Norvig 对他的 Env 类所做的有什么重要的不同?有人可以向我描述一下两者会偏离的情况吗?
如果没有区别,那么也许有人可以告诉我为什么 Norvig 使用 Env 类。谢谢:)
【问题讨论】:
-
理解Scheme最好的方法就是实现Scheme!
标签: python ruby programming-languages lisp scheme