ループ内で特殊変数をリバインドしたい。通常、これはlet
を使用して実行されます。ループマクロでの一般的なLispバインディング
(let ((*read-eval* nil))
(do-something-here))
しかしloop
マクロは、これらの素敵なwith
の句を持っているので、私はそこで行うことができるかもしれないと思いました。式(macroexpand '(loop with *read-eval* = nil))
は、バインディングをlet
に展開してしまうので、具体的には私の実装には間違いありません。しかし、これが標準化された動作であることを示すthe standardには何も見つかりません。だから、私が思う、私の質問はこれです:既存の*read-eval*
変数を変更するために必要な
(loop with *read-eval* = nil
for i from 1 to 10
do (something-involving-the-read-function))
準拠しているの実装、または彼らは、同じ名前の新しいレキシカル変数を作成するかもしれないというリスクがありますか?
これは当てはまりますが、割り当てするのではなく、** loop **が再バインドしなければならないことはまだはっきりしていません。ループが終了すると、元の値に戻りますか?変数がループの外に存在しなくなると言われているhttp://www.lispworks.com/documentation/HyperSpec/Body/06_abb.htmに基づいて、答えは「はい」と確信しています。フレーズは特別な変数では特にうまく機能しませんが、妥当な解釈は* let *(または* lambda *など)を意味する名前のローカルバインディングだけです。 –