「Let Over Lambda」の第 6 章で、 というアナフォリック マクロを見つけましたalet
。のように機能しますが、実際にテキストに出現する前にラムダ式を使用できるため、bodylet
の最後の形式がラムダ式の場合に特に便利です。alet
これはマクロの最初のバージョンですalet%
:
(defmacro alet% (letargs &rest body)
`(let ((this) ,@letargs)
(setq this ,@(last body))
,@(butlast body)
this))
ここまでは順調ですね。しかし次に、作成者は次の理由でマクロを拡張することを決定します。
alet%
本体の最後のフォーム (ラムダ フォームであると予想される) を返さないようにすることができますが、その代わりに、let フォームのレキシカル スコープ内の別の関数を検索し、代わりにその関数を呼び出す関数を作成できます。これは間接参照と呼ばれることがあります。これは、何かを行うために関数を返す代わりに、ポインター逆参照を使用して関数をルックアップし、代わりにその関数を使用する関数を返すためです。インダイレクションは、正当な理由でプログラミング言語全体に遍在する概念です。これにより、コンパイル時に間接的に修正されるものを実行時に変更できます。
alet
と定義されている:
(defmacro alet (letargs &rest body)
`(let ((this) ,@letargs)
(setq this ,@(last body))
,@(butlast body)
(lambda (&rest params)
(apply this params))))
違いはなんですか?この最終バージョンでできることとalet%
できないことは何ですか? alet
別のラムダを呼び出すラムダを返します。それは何のために良いですか?誰かが間接的な使用の例を挙げることができれば、それはありがたいです。