2
respostas

implementei um reduce generico que recebe função. Gostaria de deixar no forun para ajudar quem esta fazendo o curso

(defn meu-reduce
  ([funcao dado]
    (meu-reduce funcao dado 0))
  ([funcao dado ultimo-valor]
    (if (not (empty? dado))
      (do
        (let [f (first dado)
        r (funcao ultimo-valor f)]
        (recur funcao (next dado) r)))
      ultimo-valor)))
2 respostas

Muito legal! parabéns...

Tem alguns comportamentos diferentes do reduce padrão ainda, mas fazendo alguns testes automatizados você resolve rapidinho!

(meu-reduce min [1 2 3]) => 0

(reduce min [1 2 3]) => 1

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]))))