【问题标题】:Elisp: defmacro with &body and &rest behave differently?Elisp:带有 &body 和 &rest 的 defmacro 表现不同?
【发布时间】:2020-06-28 11:21:19
【问题描述】:

我认为 &body&rest 应该表现相同,所以这让我感到困惑:

ELISP> (defmacro mrest (&rest rest))                                                                                                                                                                                              
mrest                                                                                                                                                                                                                             
ELISP> (mrest)                                                                                                                                                                                                                    
nil                                                                                                                                                                                                                               
ELISP> (mrest 1)                                                                                                                                                                                                                  
nil                                                                                                                                                                                                                               
ELISP> (mrest 1 2)                                                                                                                                                                                                                
nil                                                                                                                                                                                                                               
ELISP> (mrest 1 2 3)                                                                                                                                                                                                              
nil                                                                                                                                                                                                                               
ELISP> (mrest 1 2 3 4)                                                                                                                                                                                                            
nil                                                                                                                                                                                                                               
ELISP> (defmacro mbody (&body body))                                                                                                                                                                                              
mbody                                                                                                                                                                                                                             
ELISP> (mbody)                                                                                                                                                                                                                    
*** Eval error ***  Wrong number of arguments: (lambda (&body body) nil), 0                                                                                                                                                       
ELISP> (mbody 1)                                                                                                                                                                                                                  
*** Eval error ***  Wrong number of arguments: (lambda (&body body) nil), 1                                                                                                                                                       
ELISP> (mbody 1 2)                                                                                                                                                                                                                
nil                                                                                                                                                                                                                               
ELISP> (mbody 1 2 3)                                                                                                                                                                                                              
*** Eval error ***  Wrong number of arguments: (lambda (&body body) nil), 3                                                                                                                                                       
ELISP> (mbody 1 2 3 4)                                                                                                                                                                                                            
*** Eval error ***  Wrong number of arguments: (lambda (&body body) nil), 4                                                                                                                                                       

为什么 elisp 坚持 mbody 在这里正好有两个参数?

【问题讨论】:

    标签: elisp elisp-macro


    【解决方案1】:

    Emacs Lisp defmacro 根本不支持 &body。因此,在您的示例中,&body 是两个强制参数之一的名称。

    您想要cl-lib 变体cl-defmacro

    【讨论】:

      【解决方案2】:

      我认为您刚刚为宏定义了两个输入,&bodybody,因为它们都是有效的符号名称,所以要求两个参数是合乎逻辑的。

      https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 2019-05-27
        • 2016-04-04
        • 2017-09-06
        • 1970-01-01
        • 2011-04-09
        相关资源
        最近更新 更多