Clojure
Macros
(defmacro reduce* [[acc init x coll] & body]
`(reduce (fn [~acc ~x] ~@body) ~init ~coll))
(defmacro reduce* [init [x coll] & body]
(let [acc-names (map name (keys init))
acc-syms (map symbol acc-names)]
`(reduce (fn [{:keys [~@acc-syms]} ~x]
~@body)
~init
~coll)))