2011-11-23 8 views
1

私はpicolispに触発されたおもちゃのリプルの実装に取り​​組んでいます。したがって、動的にスコープされた変数(およびファイルローカル変数)のみが存在します。最近私は、言語にクロージャを追加することが可能かどうか疑問に思った。現在、ラムダ式で参照されているすべての変数のバインディングは、式のアクティベーションレコード(つまり、lisp実装の明示的なスタック)に格納され、ラムダ式の実行が終了すると復元されます。クロージャが参照するシンボルのバインディングを保存し、次にクロージャの実行中にクロージャが保持するバインディングを復元し、その後に以前のバインディングを復元することで、クロージャが可能になります。クローズとダイナミックスコープ

質問:これは字句解析と同じですか?

答えて

1

saving the bindings...の意味による字句解析の良いシミュレーションですが、それは全く同じではありません。

Value is first value 
Value inside the closure first value 

あなたの閉鎖varの変異を見ていないことを意味:あなたが閉鎖のためのバインディングの値を保存する場合

(defun closure() 
    (let ((var "first value")) 
    (format #t "Value is ~a" var) 
    (let ((closure (lambda() (format #t "Value inside the closure ~a" var)))) 
     (setf var "second value") 
     (funcall closure)))) 

、次のような出力が得られます。クロージャを構築するときには現在の値のみが保存されていたためです。

完全なバインディング(変数とその値)を保存し、この変数への参照がすべて同じバインディング(変数と値)を使用すると、字句解析が終了します。

閉鎖を呼び出すと、多くのコピーが発生するため、特に効率的ではありません。

関連する問題