65
A
回答
99
let
爲某個值創建詞彙作用域不可變的別名。 binding
爲某些Var
創建動態範圍的綁定。
動態綁定意味着您的binding
表單中的代碼以及該代碼調用的任何代碼(即使不在本地詞法作用域中)都會看到新的綁定。
考慮:
user> (def ^:dynamic x 0)
#'user/x
binding
實際上創建了一個動態的Var
但let
結合僅陰影與本地別名VAR:
user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0
binding
可以使用合格的名稱(因爲它運行在Var
s)和let
不能:
user> (binding [user/x 1] (var-get #'x))
1
user> (let [user/x 1] (var-get #'x))
; Evaluation aborted.
;; Can't let qualified name: user/x
let
-引入的結合不可變。 binding
-introduced綁定線程本地可變:
user> (binding [x 1] (set! x 2) x)
2
user> (let [x 1] (set! x 2) x)
; Evaluation aborted.
;; Invalid assignment target
詞彙和動態綁定:
user> (defn foo [] (println x))
#'user/foo
user> (binding [x 1] (foo))
1
nil
user> (let [x 1] (foo))
0
nil
8
binding
在每個線程的全球環境
至於你提到的let
創建表示綁定新的作用域綁定一個值的名稱。
10
還有一個句法差異:
對於結合,前它們中的任何被綁定到VARS所有的初始值被評估。這與let不同,在那裏你可以在後面的定義中使用前一個「別名」的值。
user=>(let [x 1 y (+ x 1)] (println y))
2
nil
user=>(def y 0)
user=>(binding [x 1 y (+ x 1)] (println y))
1
nil
+0
您需要^:dynamic來將x定義爲0(也是動態的),以使您的第二個示例可以工作。 – John 2014-02-21 07:38:20
相關問題
- 1. Clojure的功能讓我們結合
- 2. clojure中的未綁定函數 - 如何綁定它們?
- 3. Clojure的:多let綁定
- 4. Clojure的遞歸讓我們通過結合
- 5. Clojure讓允許多個具有相同名稱的綁定
- 6. 綁定鍵讓我可以同時按下它們
- 7. Clojure的unsequential讓
- 8. Clojure宏和符號綁定
- 9. 我們可以將我們的TextBox綁定到MVVM的OnTextChangedEvent嗎?
- 10. 我們可否與HttpClient的lib中的cookie進行Clojure的
- 11. 不能讓我的數據綁定與knockoutJS工作
- 12. 我們需要clojure 1.4中的clojure-contrib.jar嗎?
- 13. 綁定兩個綁定資源,它們與ORM相關聯
- 14. memoize如何與Clojure中的綁定進行交互?
- 15. Clojure中與本地變量和綁定之間的區別
- 16. 快速到達EFL的Clojure/Java綁定
- 17. 取消綁定Clojure的變種
- 18. clojure函數中的「未綁定」變量
- 19. 瞭解Clojure的綁定語法
- 20. 數據綁定屬性,並讓他們(ASP.Net)的值
- 21. Google+的API讓人們「我」
- 22. 在django網站我想讓用戶創建與他們的賬戶綁定的其他用戶
- 23. 爲什麼我們需要'in(require'[...]])與Clojure?
- 24. 爲什麼我們有clojure memoize功能?
- 25. 迷茫「讓」 Clojure中
- 26. Clojure:在綁定中展開var
- 27. 如何讓我的MultiSelectList綁定到我的數據模型?
- 28. 爲什麼我不能在clojure中綁定+?
- 29. Clojure的報價裏面讓
- 30. 我們如何才能讓我們的Qt創建者自定義Getter?
這加上http://en.wikipedia.org/wiki/Scope_(programming)#Static_versus_dynamic_scoping真的提高我的理解。謝謝你,先生! – Carl 2009-10-06 22:21:42
x必須與^:動態提示綁定,纔不會拋出錯誤,我說好。 – WeGi 2014-02-14 14:29:17