1

「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別のラムダを呼び出すラムダを返します。それは何のために良いですか?誰かが間接的な使用の例を挙げることができれば、それはありがたいです。

4

1 に答える 1