我是宏新手。我正在尝试编写一个宏来生成一些函数:
(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
的正确论据吗?我该如何解决这个问题?
答案 0 :(得分:4)
这一切似乎都没问题。唯一的问题是你应该使用一个不带引号的符号来调用你的宏,如下所示:
(test stuff)
原因是,如Emacs Lisp Manual所述:
宏[...]对参数的未评估表达式进行操作,而不是像函数那样对参数值进行操作。
当您将符号传递给函数时,您将使用它们来引用它们,以防止它们被视为变量名称并计算为关联值。但是,在宏扩展期间不会评估宏参数,而是在扩展本身被评估之后进行评估。