4

我是宏的新手。我正在尝试编写一个宏来生成一些函数:

(defmacro test (name)
  `(defun ,(intern (concat "fun-" (symbol-name name))) ()
     ...))

我想将一个符号传递给这个宏(test 'stuff),但是 emacs 给了我这个错误:

Debugger entered--Lisp error: (wrong-type-argument symbolp (quote stuff))

那告诉我(quote staff)不是正确的论点symbol-name吗?我怎样才能解决这个问题 ?

4

1 回答 1

4

这一切似乎都很好。唯一的事情是你应该用一个不带引号的符号来调用你的宏,像这样:

(test stuff)

其原因是,如Emacs Lisp 手册中所述:

宏 [...] 对参数的未计算表达式进行操作,而不是像函数那样对参数值进行操作。

当您将符号传递给函数时,您习惯于引用它们以防止它们被视为变量名并评估为关联的值。但是,宏参数不会在宏扩展期间进行评估,而是在之后,当扩展本身被评估时。

于 2012-12-22T08:16:27.127 回答