【发布时间】:2017-12-16 21:25:22
【问题描述】:
考虑这个属性列表:
(defvar *some-variable* (list :foo "fooval" :bar "barval"))
这个简单的调用:
(getf *some-variable* :foo)
按预期产生"fooval"。我定义了一个宏,它应该做同样的事情,除了我可以传递任何属性的名称来检索:
(defmacro my-macro (property-name)
`(getf *some-variable* :,property-name))
不幸的是,这样称呼它:
(my-macro 'foo)
结果为@987654326@。为什么?
【问题讨论】:
-
使用 MACROEXPAND 进行调试。
-
@RainerJoswig:我已经尝试过了,但我仍然一无所知。
-
它返回了什么?
-
似乎没有人指出
:,x本质上是一个语法错误。您不能使用,来拼接符号语法中的内容:这就像您说make-,foo尝试创建一些符号一样虚假。如果你想在特定的包中构造符号,你必须做更多的工作。 -
@RainerJoswig 谢谢!我应该在发表评论之前尝试一下:我认为我认为符合标准的解释是 CLISP 的,但我实际上不确定,也许只是不清楚它是否合法。显然,它不 做的是 OP 想要的。这种错误往往来自使用“字符串中的语言”宏系统,如(颤抖)Jinja2。
标签: macros lisp common-lisp clisp gnu-common-lisp