私はいくつかの概念に慣れるために、RubyにLISPの基本バージョンを実装しています。私はPeter NorvigのLispy(http://norvig.com/lispy.html)の実装をベースにしています。私のLISPを書くのに役立ちます:) LISP環境、Rubyハッシュ
私はかかわらず、ここに欠けている、と私はいくつかの助けをいただければと思います何か...
は、次のように彼はPythonの辞書のサブクラスであります。
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を使用するよりむしろ。しかし何らかの理由で、彼の説明は私の目を通って頭の後ろを通って流れ続けます。
dictを使用せず、eval関数の中で、新しい "サブ環境"を作成する必要がある場合は、既存のdictを取り出し、更新が必要なキーと値のペアを更新して、次のevalへの新しいディクテーション?
Pythonインタプリタは以前の「外側」のenvを追跡しませんか?また、再帰の性質によって、値が "内側"から "外側"に引き出されることはありませんか?
私はRubyを使用しています。この方法で実装しようとしました。何かがうまくいかず、それが原因かもしれないし、そうでないかもしれない。当然の事項は、「ラムダ」です
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
ライン:ここに私のeval関数、envを定期的にハッシュさです。
機能的な違いがある場合は、私がここでやっていることとNorvigがEnvクラスで行ったこととの間に何が重要な違いがありますか?誰かが私に二人が逸脱するケースを説明することはできますか?
違いがなければ、NorvigがEnvクラスを使用する理由について、誰かが私に啓発することができます。ありがとう:)
Schemeを理解する最も良い方法は、Schemeを実装することです! – erjiang
ああ、本当に... :) – MikeC8