2014-10-10 52 views
2

Clojure圖中特定部分的說明

我明白除最後一行以外的所有內容。更具體地說是(:x y)部分。爲什麼指向10?也只是可以肯定...... y應該是指向整個事物(10和20)還是僅僅指向20?謝謝!

+0

沒有'Double'的定義就不明確。是'Double'中的第一個插槽叫做'x'? – noisesmith 2014-10-10 15:16:35

+0

從哪裏來這張圖? – galdre 2014-10-10 16:21:08

回答

2

在clojure中,以:作爲前綴的符號是keywordsOfficial docs。用作功能的關鍵字具有與get幾乎相同的行爲。所以(:x y)的意圖是(get y :x)

如果我們假設有一個在你的程序不會出現此圖像中(deftype Double [x y]),這意味着你最後的表格TRIPPLE類型的第二個元素是場:x或雙y.x,這正好是值(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} 
0

它是共享結構!

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

這將創建一個新的MyDouble紀錄值1020(: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}} 

什麼圖形顯示了你的是,有很多共享的結構在這裏。您在z中看到的#user.Mydouble{:x 10, :y 20},重複三次,其實是完全相同的對象,而不是三份。所以是的,在回答你最後一個問題時,箭頭指向整個事物,而不僅僅是數字20.

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春天才算作爲例外),記錄是不可變的。