将符号传递给emacs中的宏

时间:2012-12-22 05:27:30

标签: emacs macros elisp

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

(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的正确论据吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

这一切似乎都没问题。唯一的问题是你应该使用一个不带引号的符号来调用你的宏,如下所示:

(test stuff)

原因是,如Emacs Lisp Manual所述:

  

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

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