2011-05-21 50 views
14

Clojure中var和quote的含義有何區別?例如,(var a)(quote a)var和quote有什麼區別?

官方網站有以下文件,但var對象和符號的值有什麼區別?我很困惑。

(VAR符號) 符號必須解析爲var和瓦爾對象本身(而不是它的值)返回

+1

考慮在'quote'的定義中加入。這應該是有道理的。 – 2011-05-21 06:20:14

回答

17

(quote a)返回一個符號(clojure.lang.Symbol) - 它的效果與'a的效果相同。有必要詳細瞭解一下Clojure reader以瞭解更多關於符號的信息。例如:

(quote a) 
=> a 

(var a)返回由當前命名空間中的符號a表示的VAR(clojure.lang.Var)。如果未在當前名稱空間中定義a,則會出現錯誤。例如:

(var a) 
=> #<CompilerException java.lang.RuntimeException: Unable to resolve var: a in this context, compiling:(NO_SOURCE_PATH:1)> 

(def a 1) 
(var a) 
=> #'user/a 

這是技術定義 - 但這裏是它背後的直覺:一個符號是一個名稱,它可以用來查找一個變種在給定的命名空間。 var本身就是一種可以容納任何Clojure值的參考。所以一個符號標識一個包含一個值的var。

4

考慮一下:

; #'x a reader short-cut for (var x), and 'x is a short-cut for (quote x) 
(def x) 
(binding [x 1] (var-set #'x 2) (list (var x) (quote x) x)) 

將計算得到類似的信息(意見加)

(
#'sandbox177857/x ; the variable itself - was passed to var-set 
x     ; the symbol x. same as 'x 
2     ; last value in #'x 
) 

set!將採取(除其他事項外)一個VAR或解析爲一個全局名稱的符號(var-set將只接受一個Var)。 (var-set x ...)不起作用的原因是這會導致x的值被傳入(而不是Var稱爲x)。

希望這有助於。快樂的編碼。

+0

感謝您的回答。看起來Var對象是符號名稱和它的值之間的一個直接層,是嗎? – Thomson 2011-05-21 06:45:35

+0

@Thomson這是一種「討論」具有給定名稱的變量的方法。在C中,這是不需要的:'x = x + 1;'第一個x是一個l值並且不被評估。因此,Clojure中的Vars可以更強大,因爲它們可以作爲價值本身傳遞; C將需要指針樂趣。另外,因爲Var在範圍中與名稱分開,所以它可以通過可能有自己的「x」變量的不同詞法範圍傳遞 - 但Var始終是它自己的。 – 2011-05-21 06:50:55

+0

此外,我不能直接運行你的示例程序來檢查結果。我得到了「CompilerException System.Exception:無法在此上下文中解析var:x」。但如果我在樣本之前添加(def x 3),它也會生成異常。 – Thomson 2011-05-21 06:58:01

相關問題