1. ホーム
  2. macros

[解決済み] マクロ機能とは何ですか?

2022-02-09 08:47:18

質問

今日、マクロで遊んでいたら、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から しかし、それが何であり、何をするものであるかが理解できなかった。

マクロ関数の目的を明らかにする手助けがあれば、非常に感謝します。

[編集]。 を読むと、どうやら これ は、関数が展開を実装しているのですか?マクロは実際にはマクロ展開時に実行される(そしてコードになる)関数なので、それは理にかなっていますが、もしそれが正しいのなら、なぜ マクロ関数を持つマクロです。 ?

近いと感じるが、まだよくわからない

[編集後記] OK、では マクロの定義 次のようになります。

macro n. 1. a macro form 2. a macro function. 3. a macro name. 

つまり、マクロはこれらの組み合わせであり、したがってマクロ機能は単なる実装に過ぎないということでしょうか。

[EDIT MORE] 上記を踏まえると 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

解決方法は?

はい。 macro-function は、マクロ展開中にコード上で呼び出され、マクロを実装する関数です。

参照 別の質問に対する私の答え .