【问题标题】:How to know whether a symbol represents function or macro?如何知道符号代表函数还是宏?
【发布时间】:2014-08-24 19:28:40
【问题描述】:

我正在为函数/宏组合编写宏(可以混合组合)。在宏内部,我必须以不同的方式处理表示函数的符号和命名宏的符号。这是因为结果函数必须使用任意数量的参数(如果组合中的“最低”函数可以),我不能将apply 应用于宏。我的问题:如何确定给定符号代表什么:函数还是宏?

【问题讨论】:

    标签: macros lisp common-lisp symbols function-composition


    【解决方案1】:

    宏:

    CL-USER 8 > (macro-function 'bar)
    NIL
    
    CL-USER 9 > (macro-function 'lambda)
    #<Function LAMBDA 41100B7E94>
    

    功能:

    CL-USER 15 > (and (fboundp '+)
                      (not (macro-function '+))
                      (not (special-operator-p '+)))
    T
    

    【讨论】:

    • 当我将macro-function 与宏一起使用时,它会返回类似于#&lt;COMPILED-FUNCTION ...&gt; 的内容,因此宏只是一种特殊的函数。是这样吗?如果它们是函数,为什么我们不能使用apply
    • 感谢您提供额外的函数示例,我忘记了特殊运算符! (if 在我的情况下很有用)。
    • @Mark:宏转换源代码。应用宏将意味着运行时源转换。这是不平凡的。
    • @Mark 你可以(apply (macro-function '...) ...)(funcall (macro-function '...) ...)。例如,(funcall (macro-function 'lambda) '(lambda () 42) nil) =&gt; #'(LAMBDA () 42)macroexpandmacroexpand-1 可能没有做任何不同的事情。您不能直接使用applyfuncall 的原因是applyfuncall 采用函数指示符——函数或带有符号函数的符号。 (macro-function 'cond) 可能有非 nil,但 (symbol-function 'cond) 是 nil,所以你不能 (funcall 'cond …)
    • @Joshua Taylor:确定你可以调用宏函数。但这不是人们想要的。 APPLY 不采用宏,因为它只是无法按预期工作,并且设计 APPLY 让它调用宏函数是没有意义的。不仅仅是 APPLY 不允许它,从语言设计者的角度来看,还不清楚如何使它以有用的方式工作。想想与词法绑定等的交互。
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2013-10-03
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多