Clojure中var和quote的含義有何區別?例如,(var a)
和(quote a)
。var和quote有什麼區別?
官方網站有以下文件,但var對象和符號的值有什麼區別?我很困惑。
(VAR符號) 符號必須解析爲var和瓦爾對象本身(而不是它的值)返回
Clojure中var和quote的含義有何區別?例如,(var a)
和(quote a)
。var和quote有什麼區別?
官方網站有以下文件,但var對象和符號的值有什麼區別?我很困惑。
(VAR符號) 符號必須解析爲var和瓦爾對象本身(而不是它的值)返回
(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。
考慮一下:
; #'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)。
希望這有助於。快樂的編碼。
感謝您的回答。看起來Var對象是符號名稱和它的值之間的一個直接層,是嗎? – Thomson 2011-05-21 06:45:35
@Thomson這是一種「討論」具有給定名稱的變量的方法。在C中,這是不需要的:'x = x + 1;'第一個x是一個l值並且不被評估。因此,Clojure中的Vars可以更強大,因爲它們可以作爲價值本身傳遞; C將需要指針樂趣。另外,因爲Var在範圍中與名稱分開,所以它可以通過可能有自己的「x」變量的不同詞法範圍傳遞 - 但Var始終是它自己的。 – 2011-05-21 06:50:55
此外,我不能直接運行你的示例程序來檢查結果。我得到了「CompilerException System.Exception:無法在此上下文中解析var:x」。但如果我在樣本之前添加(def x 3),它也會生成異常。 – Thomson 2011-05-21 06:58:01
考慮在'quote'的定義中加入。這應該是有道理的。 – 2011-05-21 06:20:14