【问题标题】:Passing a symbol to a macro in emacs将符号传递给emacs中的宏
【发布时间】:2012-12-22 05:27:29
【问题描述】:

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

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

【问题讨论】:

    标签: emacs macros elisp


    【解决方案1】:

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

    (test stuff)
    

    原因在于,正如Emacs Lisp Manual 中所述:

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

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

    【讨论】:

    • 感谢您的回答。有没有另一种方法可以将带引号的符号传递给宏并修改宏体的一些代码然后让它工作?或者您的意思是宏永远不需要符号的引号?
    • 好吧,你总是可以eval 引用的符号来“取消引用”它,但我认为这不是很习惯......有关更多详细信息,请参阅我的编辑。
    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多