La macro for
di Clojure accetta due argomenti: una sequenza di forme vincolanti e un'espressione del corpo. In quanto tale, se voglio fare più cose nel ciclo, devo racchiudere più espressioni in un blocco do
per renderle una singola espressione.Perché Clojure per macro accetta solo un'espressione del corpo?
Confronta:
(doseq [a (range 3)]
(prn 'a a)
(inc a))
a:
(for [a (range 3)]
(prn 'a a)
(inc a))
I doseq
funziona come previsto. Il for
lamenta:
clojure.lang.ArityException: Wrong number of args (3) passed to: core/for
La mia domanda è, perché non fa questo lavoro? Perché i progettisti di Clojure non hanno consentito più espressioni "body" nel ciclo for, come hanno fatto in doseq
e when
? Non è che ci sia qualche ambiguità semantica, giusto?
Una grande differenza è che 'for' è pigro, mentre' doseq' (principalmente per indurre effetti collaterali) non lo è. 'when' valuta il suo corpo in un' do' implicito. Vedi anche http://stackoverflow.com/q/4725417 –