在普通的lisp中,我注意到我可以这样写:
(defun foo (&key (a 1) (b 2) (c (+ a b))) (print (+ a b c)))
当我致电(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
有办法做到这一点吗?
答案 0 :(得分:7)
答案 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#)
将thing
与generate-unique-id
进行两次不同的调用。