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的unsequential讓
- 3. Clojure宏和符號綁定
- 4. 我們可否與HttpClient的lib中的cookie進行Clojure的
- 5. 不能讓我的數據綁定與knockoutJS工作
- 6. 綁定兩個綁定資源,它們與ORM相關聯
- 7. 快速到達EFL的Clojure/Java綁定
- 8. 瞭解Clojure的綁定語法
- 9. 數據綁定屬性,並讓他們(ASP.Net)的值
- 10. Google+的API讓人們「我」
- 11. 在django網站我想讓用戶創建與他們的賬戶綁定的其他用戶
- 12. 爲什麼我們需要'in(require'[...]])與Clojure?
- 13. 爲什麼我們有clojure memoize功能?
- 14. 迷茫「讓」 Clojure中
- 15. JGoodies綁定不會讓我重畫我的JComponent
- 16. 如果我們無法綁定MouseBinding的命令,我們應該怎麼做?
- 17. 切換與綁定綁定
- 18. 讓我們使cell.textLabel更短
- 19. 讓我們來談談struct
- 20. Itemscontrol內Itemscontrol和綁定他們與自定義數據
- 21. 讓我們分享我們的emacs php配置
- 22. 我應該用制定者/吸氣類我讓他們
- 23. 我們可以通過廣播接收器綁定綁定服務嗎?
- 24. 的DataTemplate與定製綁定
- 25. 我的圖像不保留綁定到他們的DIV
- 26. 讓Clojure運行(lein repl)
- 27. clojure函數,讓&返回值
- 28. 綁定與Lambda?
- 29. IBOutlets與綁定
- 30. 我怎樣才能讓我的錯誤(在BindingResult)綁定到我的領域?
這加上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