let
陰影頂層瓦爾x
用當地x
。 let
不會創建Var或影響頂層Var;它會綁定一些符號,以便將該符號的本地引用替換爲綁定值let
。 let
具有詞彙範圍,因此其綁定僅在let
表單本身中可見(不在let
內調用的函數中)。
binding
臨時(線程本地)更改頂級Var x
的值,就是這麼做。如果有一個let
綁定,binding
在決定要更改哪個值時看不到它(並且let
的綁定不是變量,也不可更改,所以這是一件好事或它會給你一個錯誤)。並且binding
不會掩蓋let
。 binding
具有動態範圍,因此其對頂級變量的影響在binding
表單以及從binding
表單內調用的任何函數中都可見。
訪問的老式x
值會給你什麼是綁定的堆棧的頂部,任x
最嵌套let
結合的值(或功能paramater稱爲x
,或一些價值x
被替換如果您使用自己的宏或其他可能性),並且如果沒有其他綁定,則僅默認使用頂級變量Var x
的當前值。
即使頂層瓦爾x
由let
結合的x
掩蓋,你可以隨時通過@#'x
訪問頂層無功。試試這個版本,也許會更有意義:
(def x 1)
(defn dummy-fn2[]
(println "x from dummy-fn2:" x)
(+ x 1))
(defn dummy-fn[]
(println "entering function:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x 100]
(println "after let:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x (dummy-fn2)]
(println "after let and dummy-fn2:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(binding [x 888]
(println "after binding:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x (dummy-fn2)]
(println "after binding and dummy2:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---"))))))
給出:
entering function: 1
var x: 1
x from dummy-fn2: 1
---
after let: 100
var x: 1
x from dummy-fn2: 1
---
x from dummy-fn2: 1
after let and dummy-fn2: 2
var x: 1
x from dummy-fn2: 1
---
after binding: 2
var x: 888
x from dummy-fn2: 888
---
x from dummy-fn2: 888
after binding and dummy2: 889
var x: 888
x from dummy-fn2: 888
---
爲了避免重複的文件,或許你可以描述你期望什麼,以及爲什麼它是從實際發生的情況不同。 – 2009-11-21 03:39:59