图中特定部分的说明

时间:2014-10-10 15:11:56

标签: pointers clojure

Clojure

我理解除最后一行之外的所有内容。更具体地说是(:x y)部分。为什么指向10?也是为了确定...是y中的第一个元素应该指向整个事物(10和20)还是仅仅20?谢谢!

3 个答案:

答案 0 :(得分:2)

在clojure中,:作为前缀的符号为keywordsOfficial docs。用作函数的关键字与get具有几乎相同的行为。因此(:x y)的意图是(get y :x)

如果我们假设您的程序中有(deftype Double [x y])未出现在此图片中,则表示在您的上一个表单中,您的Tripple类型的第二个元素是字段:x或{{ Double .x的1}},只是值y。如果你想要,你可以在REPL上测试...

(Double. 10, 20)

答案 1 :(得分:1)

该图完全令人困惑。

x用于两个截然不同的事情:

  • 类型为Double
  • 的记录的符号
  • Double类型字段的名称。

假设xDouble第一个字段的名称,给定

(def y (MyDouble. x 40))

然后

(def z (Triple. x (:x y) y))

......相当于

(def z (Triple. x x y))

因此两个箭头指向Double{:x 10, :y 20},全局x的值(假设另一个字段名为y)。

将这些引用视为指针很少有帮助。记录,就像Clojure中的几乎所有基本数据结构一样(只有deftypes作为一个例外),它是不可变的。

答案 2 :(得分:0)

它的共享结构!

(defrecord MyDouble [x y]) ;; (defrecord Double [x y]) produces an exception
(defrecord Triple [a b c])
(def x (MyDouble. 10 20))

这会创建一个包含值MyDouble10的新20记录。 (:x x) => 10,(:y x) => 20。

(def y (MyDouble. x 40))

这会创建一个新的MyDouble记录。它的第一个值是x当时的值#user.MyDouble{:x 10, :y 30}。和40。也就是说,y的值为#user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40}

(def z (Triple. x (:x y) y))

这会创建一个新的Triple。宾语。与上一行一样,第一个值为#user.MyDouble{:x 10, :y 30}。第二个值是表达式(:x y)

的值
user=> (:x #user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40})
#user.MyDouble{:x 10, :y 20}

所以第二个值也是#user.MyDouble{:x 10, :y 20}。第三个值是y#user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40}的值。

打印出来的z是:

#user.Triple{:a #user.Mydouble{:x 10, :y 20}, 
             :b #user.Mydouble{:x 10, :y 20},
             :c #user.Mydouble{:x #user.Mydouble{:x 10, :y 20}, 
                               :y 40}}

图表显示的是,这里有很多共享结构。您在#user.Mydouble{:x 10, :y 20},中重复三次的z实际上是完全相同的对象,而不是三个副本。所以是的,在回答你的上一个问题时,箭头指的是整个问题,而不仅仅是数字20。