【发布时间】:2013-07-26 02:52:05
【问题描述】:
这个宏的目的是创建一个宏,为访问关联列表的某个键提供一个名称。
(defmacro generate-accessor (key-symbol prefix)
(let ((mac-name
(intern (string-upcase (concatenate 'string
prefix "-"
(string key-symbol))))))
`(defmacro ,mac-name (alis) `(assoc ,',key-symbol ,alis))))
所以当我尝试时 -
CL-USER> (generate-accessor 'a "alist")
; ERROR> 'A cannot be coerced to a string.
然而……
CL-USER> (string 'a)
; RESULT> "A"
所以我再次尝试使用 SYMBOL-NAME 将符号强制转换为字符串
(defmacro generate-accessor (key-symbol prefix)
(let ((mac-name
(intern (string-upcase (concatenate 'string
prefix "-"
(symbol-name key-symbol))))))
`(defmacro ,mac-name (alis) `(assoc ,',key-symbol ,alis))))
这一次我试试——
CL-USER> (generate-accessor 'a "alist")
; ERROR> The value 'A is not of type SYMBOL.
然而……
CL-USER> (symbol-name 'a)
; RESULT>"A"
CL-USER> (symbolp 'a)
; RESULT>T
每当我在我的宏之外使用'a 时,它都会像我期望的那样自动作为一个符号进行实习。然而不知何故,当我将'a 传递给我的宏时,它以引用块的形式到达。我不明白为什么不对其进行评估,尤其是在反引号开始之前。我知道我不了解 Lisp 的基本知识,但我现在不知道如何看待它。
【问题讨论】:
标签: macros arguments metaprogramming common-lisp symbols