【问题标题】:What is a macro-function?什么是宏功能?
【发布时间】:2013-07-12 14:31:38
【问题描述】:

我今天在玩宏,看到术语宏功能出现在 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 看来,该函数实现了扩展?好吧,这是有道理的,因为宏实际上只是一个在宏扩展时运行的函数(并产生代码),但如果这是正确的,那么为什么 “具有宏功能的宏”的术语 ?

我感觉很接近,但我还是不太明白

[再次编辑] 好的,看看definition for macro 我明白了

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

那么宏是这些的组合,因此宏功能只是实现吗?

[编辑更多] 鉴于上述情况,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

【问题讨论】:

    标签: macros common-lisp sbcl


    【解决方案1】:

    是的,macro-function是宏扩展时在代码上调用并实现宏的函数。

    另见my answer to another question。

    【讨论】:

    • 干杯,我之前读过你的其他答案,但在这次小冒险之前无法理解:) 只是为了澄清“没有宏功能的宏”的概念并没有多大意义那感觉呢?
    • @Baggers: '没有宏函数的宏' 和'没有函数定义的函数' 一样有意义 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 2016-01-24
    • 2010-12-06
    • 2014-08-30
    • 2016-06-07
    • 2012-12-14
    • 2011-12-04
    • 2010-09-16
    相关资源
    最近更新 更多