1

私はClojure の喜びで破壊の例に取り組んでいますが、私を驚かせた例に出くわしました。これらはどちらも同じ出力を生成します。

(let [range-vec (vec (range 10)) [a b c & more :as all] range-vec]
        (println "a b c: " a b c)
        (println "more: " more)
        (println "all: " all))

(let [range-vec (vec (range 10))]
    (let [[a b c & more :as all] range-vec]
        (println "a b c: " a b c)
        (println "more: " more)
        (println "all: " all)))

最初の形式は私の直感に反していました。なぜなら、束縛と優先順位が左から右に起こると考えると、「すべて」に割り当てる前に range-vec が定義されないからです。2 番目の形式である range-vec は既に定義されており、2 番目の let ステートメントで all に割り当てられています。これは、これまでに知っている規則に従っているようです。シンボルがバインドされた時期とその順序はいつわかりますか?

4

1 に答える 1

3

Clojureのドキュメントによると:

バインディングはシーケンシャルであるため、各バインディングは前のバインディングを見ることができます。

あなたはLispまたはSchemeプログラマーですか? この点で、 Clojureletlet*CL や Scheme と似ています。

于 2013-04-10T19:15:23.670 に答える