2013-07-12 52 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看來,該功能實現擴展?那麼這個宏是有意義的,它實際上只是一個運行在宏擴展時間的函數(並且會產生代碼),但如果這是正確的話,爲什麼「宏函數宏」

我感覺更接近,但我還是沒有完全得到它

[編輯AGAIN] 好了,所以看definition for macro我得到這個

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

所以是宏的這些組合和因此宏觀功能只是實現?

[編輯更多] 鑑於上述情況,CLHS entry for defmacro似乎是有道理的。任何人都可以確認,如果我在這裏的正確軌道上,並且如果有可能沒有宏功能的宏,如果不是,那麼我不明白爲什麼它指定了它是一個宏與宏功能'

[FINAL EDIT] 宏是一個符號與函數槽綁定到一個宏函數? (這一措辭是胡扯,我可以提供幫助這裏做!)

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