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)))

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

4

1 回答 1

3

根据Clojure 文档

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

你是 Lisp 或 Scheme 程序员吗?Clojure在这方面let就像let*在 CL 或 Scheme 中。

于 2013-04-10T19:15:23.670 回答