【发布时间】:2012-12-26 23:34:03
【问题描述】:
我正在使用 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 之前扩展快速槽。这让我想到了我的问题:如何做到这一点?或者,如果您对我最初的难题有不同的解决方案,那也不会不受欢迎。
【问题讨论】:
-
忠告:不要通过微不足道的宏“改进”基本的 Common Lisp 语法,而是使用编辑器自动插入您认为冗长的代码。 defclass 的语法是初学者编写的宏的特别受害者。
-
@hans23 非常好的建议。
-
另一个可能的选择是使用
defstruct而不是defclass。它更轻量级,除了定义initargs和accessors外,它还定义了一个可读的打印方法。
标签: macros common-lisp clos