Elisp:defmacro with &body 和 &rest 表现不同?
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
这里只有两个参数?
Emacs Lisp defmacro
根本不支持 &body
。因此,在您的示例中,&body
是两个强制参数之一的名称。
您想要 cl-lib
变体,cl-defmacro
。
我认为您刚刚为宏定义了两个输入,&body
和 body
因为它们都是有效的符号名称,所以要求两个参数是合乎逻辑的。
https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html
我认为 &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
这里只有两个参数?
Emacs Lisp defmacro
根本不支持 &body
。因此,在您的示例中,&body
是两个强制参数之一的名称。
您想要 cl-lib
变体,cl-defmacro
。
我认为您刚刚为宏定义了两个输入,&body
和 body
因为它们都是有效的符号名称,所以要求两个参数是合乎逻辑的。
https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html