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

cas*_*per 4 common-lisp

在常见的lisp我注意到我可以这样写:

(defun foo (&key (a 1) (b 2) (c (+ a b))) (print (+ a b c)))
Run Code Online (Sandbox Code Playgroud)

当我打电话时(foo),6打印出来.所以参数c可以引用为a和设置的值b.但我似乎找不到办法做类似的事情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
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

fio*_*bio 6

您可以使用:constructor选项执行此操作defstruct.

CL-USER> (defstruct (thing
                      (:constructor make-thing (&key a b (c (+ a b)))))
           a b c)
THING
CL-USER> (make-thing :a 1 :b 2)
#S(THING :A 1 :B 2 :C 3)
Run Code Online (Sandbox Code Playgroud)

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