【发布时间】:2012-07-19 12:53:25
【问题描述】:
我很难理解 Peter Norvig 的代码中的一点,“更好的 Python Lisp 解释器”,here。
在eval函数中,针对解析,他在做测试isanstance(x,Symbol)。类 Symbol 之前定义过,但它没有方法,因为它是用 pass 声明的:
class Symbol(str): pass
这些行构建了一个符号表。
def Sym(s, symbol_table={}):
"Find or create unique Symbol entry for str s in symbol table."
if s not in symbol_table: symbol_table[s] = Symbol(s)
return symbol_table[s]
_quote, _if, _set, _define, _lambda, _begin, _definemacro, = map(Sym,
"quote if set! define lambda begin define-macro".split())
_quasiquote, _unquote, _unquotesplicing = map(Sym,
"quasiquote unquote unquote-splicing".split())
我不明白为什么Symbol(s) 可以工作,因为没有定义 Symbol 类的构造函数。之后,eval 方法通过以下方式检查令牌是否为符号:
def eval(x, env=global_env):
"Evaluate an expression in an environment."
while True:
if isa(x, Symbol): # variable reference
return env.find(x)[x]
else: #other stuff
isa(x,Symbol) 是个谜。这里在代码中,应该检查token是否是一个变量引用(即x,与之前定义的x)。在我看来,这里的 Symbol(s) 是对字符串的一种装饰,在用
_quote, _if, _set, _define, _lambda, _begin, _definemacro, = map(Sym,
"quote if set! define lambda begin define-macro".split())
您能否根据您对 P. Norvig 的代码的了解或阅读或 Python 的经验进行解释?谢谢
【问题讨论】:
标签: python scheme interpreter isinstance