我正在使用 common lisp,发现自己经常输入以下形式的插槽定义:
(name :initarg :name :accessor name)
所以我想编造一个宏来加速这个。我想出了以下内容:
(defmacro quickslot (name)
`(,name :initarg ,(intern (string-upcase name) "KEYWORD") :accessor ,name))
毫无疑问,这是一个肮脏的黑客,但很实用。或者我是这么想的。当我试图运行我的代码时,我遇到了一个障碍:因为 defclass 是一个宏,所以传递给它的参数是未经评估的。这意味着,而不是看到
(x :initarg :x :accessor x)
它看到
(quickslot x)
当然,这表明一个错误。
在我看来,答案是以某种方式控制宏扩展的顺序,以确保在 defclass 之前扩展快速槽。这让我想到了我的问题:如何做到这一点?或者,如果您对我最初的难题有不同的解决方案,那也不会不受欢迎。