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
メソッドはトークンが Symbol かどうかを次のようにチェックします。
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) であるかどうかを確認する必要があります。私の意見では、ここのシンボルは文字列の装飾であり、で構築された初期化リストにあります
_quote, _if, _set, _define, _lambda, _begin, _definemacro, = map(Sym,
"quote if set! define lambda begin define-macro".split())
P. Norvig によるこのコードの知識や読み方、または Python の経験に基づいて説明していただけますか? ありがとう