我可以参考defstruct中的其他插槽吗?

时间:2009-02-08 14:33:25

标签: common-lisp

在普通的lisp中,我注意到我可以这样写:

(defun foo (&key (a 1) (b 2) (c (+ a b))) (print (+ a b c)))

当我致电(foo)时,会打印6。因此,参数c可以引用为ab设置的值。但我似乎无法找到与defstruct类似的方法。类似的东西:

CL-USER> (defstruct thing a b c)
THING
CL-USER> (setq q (make-thing :a 1 :b 2 :c (+ a b)))
; Evaluation aborted
CL-USER> (setq q (make-thing :a 1 :b 2 :c (+ :a :b)))
; Evaluation aborted

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:7)

您可以使用:constructor的{​​{1}}选项执行此操作。

defstruct

有关详细信息,请参阅defstruct的CLHS条目。

答案 1 :(得分:3)

不那样。但是使用Lisp读者技巧你可以做到:

(make-thing :a #1=1 :b #2=2 :c (+ #1# #2#))

否则使用defclass并专门化通用函数shared-initialize

请注意,这些读者宏将引用表单,而不是评估它的结果。因此

(make-thing :id #1=(generate-unique-id) :my-id-is #1#)

thinggenerate-unique-id进行两次不同的调用。