我正在研究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语句中分配给所有,这似乎遵循我目前所知的规则。我何时知道符号何时被绑定以及发生的顺序?
答案 0 :(得分:3)
绑定是顺序的,因此每个绑定都可以看到先前的绑定。
您是Lisp还是Scheme程序员?在这方面,Clojure let
就像CL或Scheme中的let*
一样。