今日、私はマクロをいじっていて、マクロ関数という用語が REPL にあるのを見ました。マクロ、コンパイラ マクロ、リーダー マクロには精通していますが、これらに遭遇したことはありません。
CL-USER> (defmacro fnaa (&rest rest) `(lambda ,@rest))
FNAA
CL-USER> #'fnaa
#<CLOSURE (LAMBDA (&REST SB-C::ARGS) :IN MACRO-FUNCTION) {1003A6DD6B}>
私は 'fnaa を検査し、これを得ました:
#<SYMBOL {1003A40A5F}>
--------------------
Its name is: "FNAA"
It is unbound.
It a macro with macro-function: #<FUNCTION (MACRO-FUNCTION FNAA) {1003A610BB}>
It is internal to the package: COMMON-LISP-USER
Property list: NIL
CLHS からこれを読みましたが、それが何で、何をするのか理解できませんでした
マクロ関数の目的を明らかにする助けをいただければ幸いです。
[編集]関数が拡張を実装しているように見えますか? マクロは実際にはマクロ展開時に実行される (そしてコードになる) 関数であるため、それは理にかなっていますが、それが正しい場合、なぜ「マクロ関数を持つマクロ」という用語を使用するのでしょうか?
近い気がするけどまだよく分からない
[もう一度編集] わかりましたので、マクロの定義を見て、これを取得します
macro n. 1. a macro form 2. a macro function. 3. a macro name.
マクロはこれらの組み合わせであり、マクロ関数は単なる実装ですか?
[さらに編集] 上記を考えると、defmacro の CLHS エントリは理にかなっているようです。私がここで正しい軌道に乗っているかどうか、またマクロ関数のないマクロを使用できるかどうかを誰かが確認できますか?マクロ機能付き」
[最終編集] マクロは、関数スロットがマクロ関数にバインドされたシンボルですか? (この言い回しは、ここで助けを借りて私ができるがらくたです!)
CL-USER> (setf (macro-function 'jam) (lambda (x y) nil))
検査ジャム
#<SYMBOL {100400317F}>
--------------------
Its name is: "JAM"
It is a global variable bound to: NIL [unbind]
It a macro with macro-function: #<FUNCTION (LAMBDA (X Y)) {1005522FAB}> [unbind]
It is internal to the package: COMMON-LISP-USER [export] [unintern]
Property list: NIL