簡體   English   中英

Elisp:帶有 &body 和 &rest 的 defmacro 表現不同?

[英]Elisp: defmacro with &body and &rest behave differently?

我認為&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在這里正好有兩個 arguments ?

Emacs Lisp defmacro根本不支持&body 因此,在您的示例中, &body是兩個強制性 arguments 之一的名稱。

您需要cl-lib變體cl-defmacro

我認為您剛剛為宏定義了兩個輸入, &bodybody ,因為它們都是有效的符號名稱,所以要求兩個 arguments 是合乎邏輯的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM