2013-07-12 9 views
7

今日はマクロで遊んでいて、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 

私は任意の助けをthis from the CLHSを読みましたが、それが何だったか理解できませんでしたし、それが

何をするか、マクロ機能の目的を照らすだろう大変感謝します。

[編集] thisの機能は拡張機能を実装していると思われますか?マクロは実際にはマクロ展開時に(そして結果はコード内で)実行される関数なので意味がありますが、それが正しければというマクロの機能を持つマクロがの理由はなんですか?

ので、だから、マクロがこれらの組み合わせであり、私はこの

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

を得るdefinition for macro見て[AGAIN EDIT] [OK]を、私は近くに感じるが、私はまだかなりそれに

が届きませんしたがって、マクロ関数は実装にすぎませんか?

[編集詳細] 上記を考えると、CLHS entry for defmacroは意味をなさないようです。私はここに正しいトラックにいるかどうか、またマクロ機能を持たないマクロを持つことが可能かどうかを誰にでも確認できますか?そうでなければ、なぜそれがマクロマクロ機能付き '

[最終編集] マクロは、機能スロットがマクロ機能にバインドされたシンボルですか? (この言い回しは、私はここに助けを借りて行うことができますがらくたである!)

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 

答えて

7

を点検はい、macro-functionは、マクロ展開時にコードに呼び出される関数で、マクロを実装しています。

my answer to another questionも参照してください。

+0

乾杯、私は前にあなたの他の答えを読んだが、この小さな冒険の前にそれを理解することができなかった:)マクロ機能のないマクロの概念はそれほど意味がない? – Baggers

+0

@Baggers: 'マクロ機能を持たないマクロ'は、 '関数定義なしの関数'と同じくらい意味があります:-) – sds

+0

ハハ、よく置いてください。ありがとう! – Baggers

関連する問題