有没有办法引用先前定义的结构图条目(内联)?

时间:2013-01-24 16:35:16

标签: clojure

标题不是很好,但很难找到一个好的单行:)

问题如下。鉴于声明:

(def mystruct (create-struct :a :b :c))

是否可以通过以下方式构建实例(显然类似):

(struct-map mystruct :a 1 :b 2 :c (inc (:b this)))

我设法用以下的bizzaro方式得到这样的东西:

(def mystructinst (struct-map mystruct :a 1 :b 2 :c (inc (:b mystructinst))))

但说实话,我不知道为什么会这样。我认为mystructinst仅在评估包含的表单后绑定。这是执行此任务的一种干净方式吗?还有更好的吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

如何:

(let [b 2] (struct-map mystruct :a 1 :b b :c (inc b)))

在使用def 评估包含的表单之后,符号仅绑定是正确的,这就是为什么您的上一个示例抛出NullPointerException。您可能在没有意识到的情况下在其他地方预定义了mystructinst。您可以移动要在struct-map之外引用的变量,并将其放在let中。然后,它可以在任何地方访问。

另请注意,let 允许您在后续绑定中引用先前的绑定:

user=> (let [a 1 b (inc a)] b)
2