6

lispでは、このようなクロージャにバインドされた自由変数をバインドできます...

(let ((x 1) (y 2) (z 3))
  (defun free-variables () (+ x y z)))

(free-variables)

結果は...

6

私が知りたいのは、バインドされたクロージャ変数を動的に検査できるかどうかです。

例えば

(inspect-closure free-variables)

結果として...

((x 1) (y 2) (z 3))

ありがとうSO

4

2 に答える 2

7

Common Lisp

クロージャの内部変数へのアクセスは、同じスコープ内の関数からのみ可能です(Jeffの回答を参照)。それらでさえ、これらの変数をどこかで照会することはできません。この機能は、CommonLisp標準では提供されていません。

明らかに、多くの場合、個々のCommonLisp実装はこの情報を取得する方法を知っています。たとえば、GNU EmacsのSLIMEコード(Common Lisp開発環境)を見ると、検査およびバックトレース機能のコードがそれを提供するはずです。開発はこれを示したいと思っています-ユーザー/プログラマーにとって、CommonLisp標準はその情報を提供しません。

于 2011-05-29T11:53:12.980 に答える
4

エンクロージャー内に複数の機能を含めることができるため、別の機能を追加するだけです

(defun inspect-closure () (list (list 'x x) (list 'y y) (list 'z z)))

letそしてそれをあなたの声明の中に入れてください

-any-closureにアクセスする関数を作成しようとしている場合、厳密に言えば、それは不可能だと思います。x、y、zはローカルで定義されているため、それらを世界に発表する場合は、クロージャー内から取得する必要があります。あなたができることはlet、ローカル変数を返す機能が追加された機能を複製するマクロを作成することです。おそらく、何か別の名前を付けたいと思うでしょうmylet

于 2011-05-29T03:56:11.853 に答える