此宏的目的是创建一个宏,该宏为访问关联列表的某个键提供一个名称。
(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 的基本知识,但我现在不知道如何看待它。