CommonLispの変数にS式をバインドしています。
(defvar x '(+ a 2))
ここで、呼び出されたときに、それが定義されたスコープ内の式を評価する関数を作成したいと思います。私はこれを試しました:
(let ((a 4))
(lambda () (eval x)))
と
(let ((a 4))
(eval `(lambda () ,x)))
しかし、これらは両方とも問題を引き起こします。EVALはトップレベルでコードを評価するため、式に含まれる変数をキャプチャできません。LETフォームをEVALに入れることができないことに注意してください。解決策はありますか?
編集:それで、EVAL問題の解決策がない場合、他にどのようにそれを行うことができますか?
編集:私が何をしようとしているのかについて質問がありました。私はコンパイラを書いています。式が定義されている字句環境で変数が閉じられたs式を受け入れたい。確かにそれをマクロとして書く方が良いかもしれません。