Let Form中的从左到右的绑定顺序

时间:2013-04-10 18:50:28

标签: clojure let destructuring

我正在研究Joy of 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)))

现在最初的第一种形式反驳了我的直觉,因为认为绑定和优先级从左到右发生,在分配给“all”之前不会定义范围-vec。我是第二种形式,range-vec已经定义,然后在第二个let语句中分配给所有,这似乎遵循我目前所知的规则。我何时知道符号何时被绑定以及发生的顺序?

1 个答案:

答案 0 :(得分:3)

根据Clojure documentation

  

绑定是顺序的,因此每个绑定都可以看到先前的绑定。

您是Lisp还是Scheme程序员?在这方面,Clojure let就像CL或Scheme中的let*一样。