将符号传递给宏中的emacs
问题描述:
我是宏的新手。我试图写一个宏来生成一些功能:将符号传递给宏中的emacs
(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
的正确参数?我怎样才能解决这个问题 ?
答
这一切似乎都没问题。唯一的一点是,你应该打电话给你的宏用不带引号的符号,例如:
(test stuff)
这样做的原因是,在注意到Emacs Lisp Manual:
Macros [...] operate on the unevaluated expressions for the arguments, not on the argument values as functions do.
当您将符号函数,您可以引用它们来防止它们被视为变量名称并评估为关联值。但是,在宏扩展期间不对宏参数进行评估,但之后会在评估扩展本身时进行评估。
感谢您的回答。有没有另外一种方法可以将引用符号传递给宏并修改宏体的某些代码,然后使其工作?或者你的意思是一个符号的引用从来不需要宏? – Edityouprofile
那么,你总是可以''评价'引用'的符号来“引用”它,但我不认为这是非常习惯......见我的编辑更多细节。 – Francesco
很清楚,谢谢! – Edityouprofile