2013-04-10 2 views
1

Я работаю над примером деструктурирования в 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))) 

Теперь изначально первая форму противопоставить свою интуицию, потому что, думая, что связывание и старшинство случилось слева направо, что диапазон-VEC не будет определен до назначения на «все» , I вторая форма, range-vec уже определена, а затем назначена всем во втором оператор let, который, как представляется, соответствует правилам, которые я знаю до сих пор. Когда я узнаю, когда был привязан символ и порядок, в котором это происходит?

ответ

3

Согласно Clojure documentation:

привязки являются последовательными, так что каждое связыванием может увидеть предыдущие привязки.

Вы программист Lisp или Scheme? Clojure let походит на let* в CL или Схему в этом отношении.

+0

Я новичок в lisps в целом, поэтому я не familia с 'let *'. Итак, привязки идут слева направо, а не справа налево? –

+1

Да, привязки слева направо. Таким образом, ваши две версии эквивалентны. – Barmar

+0

Спасибо, понял! –