質問
私は理解していいの異なる一つの動作の設定 *compile-path*
一つは来ない。しかしながらプレーする必要がありますがなぜ彼らは違います。
let
新しく作成し範囲を指定されたバインディングが binding
...?
解決
let
を語彙的に小scoped不変なエイリアスです。 binding
作動的にscoped結合部 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
導入されたバインディングがスレッドに変更可能な地域:
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
他のヒント
結合対のletのためのもう一つの構文上の差異ます:
それらのいずれかがVARSにバインドされる前に、結合のために、すべての初期値が評価されます。これは、後続の定義で前の「エイリアス」の値を使用することができることができます、異なっている。
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
binding
は、スレッドごとのグローバル環境での名前に値をバインドします。
あなたが述べたように、let
は言ったバインディングのための新しいスコープを作成します。
所属していません StackOverflow