Pointers 图表中特定部分的说明

Pointers 图表中特定部分的说明,pointers,clojure,Pointers,Clojure,除了最后一行,我什么都懂。更具体地说是(:x y)部分。为什么指向10?也只是为了确定。。。y中的第一个元素应该指向整个东西(10和20),还是仅仅指向20?谢谢大家! 在clojure中,前缀为:的符号是。关键字用作函数时,其行为与函数几乎相同。所以(:xy)的意图是(get y:x) 如果我们假设在您的程序中有一个(deftype Double[xy])未出现在此图像中,这意味着在您的最后一个表单中,Triple类型的第二个元素是Double的字段:x或.x,即Double(Double.1


除了最后一行,我什么都懂。更具体地说是(:x y)部分。为什么指向10?也只是为了确定。。。y中的第一个元素应该指向整个东西(10和20),还是仅仅指向20?谢谢大家!

在clojure中,前缀为
的符号是。关键字用作函数时,其行为与函数几乎相同。所以
(:xy)
的意图是
(get y:x)

如果我们假设在您的程序中有一个
(deftype Double[xy])
未出现在此图像中,这意味着在您的最后一个表单中,Triple类型的第二个元素是Double
的字段
:x
.x
,即Double
(Double.10,20)
。如果你想的话,你可以在REPL上测试这个

user> (defrecord MyDouble [x y])
user.MyDouble
user> (defrecord MyTripple [x y z])
user.MyTripple
user> (def x (MyDouble. 10 20))
#'user/x
user> (def y (MyDouble. x 40))
#'user/y
user> (def z (MyTripple. x (:x y) y))
#'user/z
user> z
#user.MyTripple{:x #user.MyDouble{:x 10, :y 20}, :y #user.MyDouble{:x 10, :y 20}, :z #user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40}}
user> (:x y)
#user.MyDouble{:x 10, :y 20}

这是共享结构

(defrecord MyDouble[x y]);;(defrecord Double[x y])生成异常
(三重记录[a b c])
(def x(MyDouble.10 20))
这将创建一个新的
MyDouble
记录,其值为
10
20
<代码>(:x)
=>10,
(:yx)
=>20

(定义y(MyDouble.x 40))
这将创建一个新的
MyDouble
记录。它的第一个值是
x
当时的值,即
#user.MyDouble{:x10,:y30}
。和
40
。也就是说,
y
的值为:
#user.MyDouble{:x#user.MyDouble{:x10,:y20},:y40}

(定义z(三重x(:x y)y))
这将创建一个新的
三元组
。对象与前一行一样,第一个值是
#user.MyDouble{:x10,:y30}
。第二个值是表达式
(:x y)
的值:

user=>(:x#user.MyDouble{:x#user.MyDouble{:x10,:y20},:y40})
#user.MyDouble{:x10,:y20}
所以第二个值也是
#user.MyDouble{:x10,:y20}
。第三个值是
y
#user.MyDouble{:x#user.MyDouble{:x10,:y20},:y40}
的值

所以打印出来的
z
,是:

#user.Triple{:a#user.Mydouble{:x10,:y20},
:b#user.Mydouble{:x10,:y20},
:c#user.Mydouble{:x#user.Mydouble{:x10,:y20},
:y 40}

图中显示的是这里有很多共享结构。实际上,您在
z
中看到的
#user.Mydouble{:x10,:y20},
重复了三次,它是完全相同的对象,而不是三个副本。因此,是的,在回答你的最后一个问题时,箭头指向的是整个问题,而不仅仅是数字20。

这个图表完全令人困惑

x
用于两种不同的用途:

  • 双精度
    记录类型的符号
  • 类型为
    Double
    的字段的名称
假设
x
Double
的第一个字段的名称,给定

(def y (MyDouble. x 40))
然后

。。。相当于

(def z (Triple. x x y))
因此,两个箭头指向全局
x
(假设另一个字段名为
y
)的双{:x10,:y20}


<> p>并且很少考虑将这些引用作为指针。记录,就像Clojure中几乎所有的基本数据结构一样(只有spring例外),是不可变的

如果没有
Double
的定义,这是不明确的。
Double
中的第一个插槽是否称为
x
?此图从何而来?
(def z (Triple. x x y))