我很难理解 Peter Norvig 的代码中的一点,“更好的 Python Lisp 解释器”,在这里。
在eval函数中,针对解析,他正在做测试isanstance(x,Symbol)。类 Symbol 之前定义过,但它没有方法,因为它是用 pass 声明的:
class Symbol(str): pass
这些行构建了一个 symbol_table。
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 经验的了解或阅读进行解释?谢谢