質問

私は理解していいの異なる一つの動作の設定 *compile-path* 一つは来ない。しかしながらプレーする必要がありますがなぜ彼らは違います。

let 新しく作成し範囲を指定されたバインディングが binding...?

役に立ちましたか?

解決

let を語彙的に小scoped不変なエイリアスです。 binding 作動的にscoped結合部 Var.

動的結合のコード内 binding 形は、任意のコードがそのコードが呼び出しでもない場合には、地元の語彙の範囲に新たに結合する。

指:

user> (def ^:dynamic x 0)
#'user/x

binding 実際に作動的結合のための Varlet みの影varをもとに現地のエイリアス:

user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0

binding で修飾名で動作す Vars) 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

参照 Vars, ましょう.

他のヒント

結合対の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は言ったバインディングのための新しいスコープを作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top