Agora esta bem mais próximo do comportamento.vou parar por aqui. Encontrei uns comportamentos muito estranhos do reduce padrão.
; comportamento estranho do reduce padrão
(reduce * [])
=> 1
(defn eh-corner? [dado valor-persistente]
(and
(or (empty? dado) (== (count dado) 1))
(nil? valor-persistente)))
(defn escolhe-prov [funcao dado valor-persistente]
(if (nil? valor-persistente)
(funcao (first dado))
(funcao valor-persistente (first dado))))
(defn meu-reduce [funcao dado & [valor-persistente]]
(if (eh-corner? dado valor-persistente)
(do
(funcao (first dado))))
(if (empty? dado)
valor-persistente
(let [v-prox-chamada (escolhe-prov funcao dado valor-persistente)]
(recur funcao (rest dado) [v-prox-chamada]))))