我正在研究 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,这似乎是遵循我目前所知道的规则。我什么时候知道符号何时被绑定以及发生的顺序?