Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvidas sobre o funcionamento do map

Não entendi por que o retorno da função não foi:

(valor [:mochila {:quantidade 2, :preco 80}] 15
valor [:camiseta {:quantidade 3, :preco 40}] 15

O mapa não executa a função para cada elemento do pedido (mochila, camiseta)? Neste caso o 15 deveria ser concatenado a cada item, não ?

Código original:

(def pedido {:mochila { :quantidade 2, :preco 80}
                         :camiseta {:quantidade 3, :preco 40}})

(defn imprime-e-15 [valor]
  (println "valor" valor)
  15)

(println (map imprime-e-15 pedido))
(valor [:mochila {:quantidade 2, :preco 80}]
valor [:camiseta {:quantidade 3, :preco 40}]
15 15
2 respostas

Boa noite Janaina! Acho que a função map era aplicada antes na println depois era adicionado o valor 15. Então é só mudar um pouco a função imprime-e-15 mudando o lugar do penúltimo parenteses:

(defn imprime-e-15 [valor]
  (println "valor" valor 15))

(map imprime-e-15 pedido)

Resultado:

(valor [:mochila {:quantidade 2, :preco 80}] 15
valor [:camiseta {:quantidade 3, :preco 40}] 15
nil nil)
solução!

Na verdade estava me referindo que na versão original estava com imprimindo primeiro os dois mapas e depois retornando o valor de retorno (15) das duas funções. Assim:

(valor [:mochila {:quantidade 2, :preco 80}]
valor [:camiseta {:quantidade 3, :preco 40}]
15 15 

E isso acontece, pois a função map executa toda e depois evalua seus retornos. Entretanto, a função println é executada no momento que o map passa por ela. Dessa forma, passa no print e mostra o valor e só depois de terminar de passar por todo o map que retorna seus valores.

Para que o retorno do map seja instantâneo, pode-se usar a função mapv.