[解決済み] マクロ機能とは何ですか?
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
は、マクロ展開中にコード上で呼び出され、マクロを実装する関数です。
参照 別の質問に対する私の答え .
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン