Clojure's for
makro akceptuje dwa argumenty: sekwencję form wiążących i wyrażenie ciała. Jako takie, jeśli chcę zrobić wiele rzeczy w pętli, muszę zawijać wiele wyrażeń w bloku do
, aby uczynić je pojedynczym wyrażeniem.Dlaczego Clojure's for macro akceptuje tylko jedno wyrażenie ciała?
Porównaj:
(doseq [a (range 3)]
(prn 'a a)
(inc a))
do:
(for [a (range 3)]
(prn 'a a)
(inc a))
W doseq
działa zgodnie z oczekiwaniami. for
narzeka:
clojure.lang.ArityException: Wrong number of args (3) passed to: core/for
Moje pytanie brzmi, dlaczego nie to działa? Dlaczego projektanci (i) Clojure nie dopuszczają wielokrotnych wyrażeń "ciała" w pętli for, tak jak w przypadku doseq
i when
? To nie jest tak, jakby istniała jakakolwiek semantyczna dwuznaczność, prawda?
Jedną z dużych różnic jest to, że 'for' jest leniwy, natomiast' doseq' (głównie w celu wywoływania efektów ubocznych) nie jest. 'when' ocenia swoje ciało w postaci niejawnego' do'. Zobacz także http://stackoverflow.com/q/4725417 –