let
影トップレベルVarの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
---
を、おそらくあなたは、あなたが期待するかを説明でき、なぜそれが実際に何が起こるかは異なるのです。 –