2016-02-20 41 views
4

我想了解Var的clojure概念。Clojure Vars與其他語言的指針/參考文獻

據我所知,它只是一個參考/指向值的指針。 Var的「根值」可以認爲是Var指向線程的初始值。此外,我認爲 - 在幕後 - 每個Var都有一個指向它所指向的內存位置的地址(儘管像Java,Javascript這樣的語言不能讓你訪問該特定位置,並且可能做一些事情無論如何,這些地址使得地址不穩定)。

問題:這是正確的思考方式嗎?將clojure Var作爲參考/指向某個值的指針的方式是錯誤的?

鑑於類似

(def v 7) 

是否合適說這樣的話「瓦爾#'V指向值7" ?

+0

相當不錯的總結在這裏:http://www.braveclojure.com/zombie-metaphysics/ – jmargolisvt

+0

也很不錯:http://gfredericks.com/speaking/2015-02-25-vars.pdf – ClojureMostly

回答

4

是的,這是一個很好的概念。我會稍微調整你的最終陳述: #'v擴展爲(var v),說var(var v)沒有意義,而我會說var v。我也會說derefs的值爲7而不是指向。是的,他們的行爲像指針,但他們有一個特殊的deref(或@)形式來解引用它們(並且你不能做指針算術)。

我認爲採用術語deref是理解的Clojure的另一個方面很重要:當你使用任何符號,說我們做一個函數調用(inc 1),實際上是一個隱藏的一步! inc是一個符號,它與變量inc相關聯,(inc不是一個真正的函數!inc只是函數的一個函數),但隨後自動計算變量deref。當你寫(var inc)時,你實際上只是防止那deref。這就是爲什麼當你改變或替換一個變種,比如說我們重新定義了inc時,新的代碼就被執行了。

問題是,當用指針的方式思考時,可能會想到inc是某些var指向的函數。這是不正確的。 inc是與關聯到函數的var關聯的符號。使用var inc時,爲了方便起見,它會自動解析爲函數。從這個意義上說,你可以爭辯說,只要說v derefs到7就是準確的。 v是一個var,你並不需要指定它。 (很顯然,當你試圖明確指出它是一個var時,所以把它稱爲var也是不錯的)。

+1

「你必須使用alter-var-root來設置它們「這是錯誤的 - 你可以用'intern'或'def'設置變量,以及其他方法 – noisesmith

+0

Crikey!感謝您的更正。我刪除了不正確的陳述。如果它仍然不是很正確,請直接編輯答案。我想添加一個alter-var-root,def和intern的解釋會很有用。再次感謝您展示錯誤,我刪除了之前的評論,因爲它是錯誤的,我不想分散讀者對它的回答。 –