Clojure 是否有任何方法可以引用以前定义的结构映射条目(内联)?
标题不是很好,但很难找到一个好的一行:) 问题如下。鉴于宣言:Clojure 是否有任何方法可以引用以前定义的结构映射条目(内联)?,clojure,Clojure,标题不是很好,但很难找到一个好的一行:) 问题如下。鉴于宣言: (def mystruct (create-struct :a :b :c)) 是否可以通过以下方式构建实例(显然是类似的方式): 我通过以下bizzaro方式获得了类似的结果: (def mystructinst (struct-map mystruct :a 1 :b 2 :c (inc (:b mystructinst)))) 但老实说,我不知道为什么会这样。我认为mystructinst只有在对所包含的表单进行评估之后才
(def mystruct (create-struct :a :b :c))
是否可以通过以下方式构建实例(显然是类似的方式):
我通过以下bizzaro方式获得了类似的结果:
(def mystructinst (struct-map mystruct :a 1 :b 2 :c (inc (:b mystructinst))))
但老实说,我不知道为什么会这样。我认为mystructinst只有在对所包含的表单进行评估之后才能绑定。这是执行此任务的干净方法吗?有更好的吗
谢谢您的时间。就这样吧:
(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
相同的波长:@OmriBernstein谢谢,这是一个很好的链接,它确实与我试图实现的目标是一样的。然而,我想知道我提出的构造为什么有效。@tudorvindilescu:您的上一个代码不起作用(抛出空指针ex)。它可能在您的情况下起作用,因为您已经定义了一个
mystructinst
BTW,结构映射现在被准弃用,取而代之的是记录。
user=> (let [a 1 b (inc a)] b)
2