Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 是否有任何方法可以引用以前定义的结构映射条目(内联)?_Clojure - Fatal编程技术网

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