Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Meu mapa parada no nil

Uma duvida, na aula1 no segundo video, foi feito um "meu_mapa" que recebe uma lista e itera sobre essa lista/vetor.

Quando um dos valores eh false ele para, e então substituiu o if por "nil" mas quando um dos itens eh "nil" ele para também.

Como arrumar isso?

1 resposta

Olá Cesar, tudo bem?

Eu também estava fazendo a aula e cheguei numa forma que evitamos essa parada no nil da seguinte forma:

(defn meu-mapa
  "Simula um map sem retornar valor algum
    apenas aplicando a função no elemento"
  [function elements]
  (if (seq elements)
    (do
      (function (first elements))
      (recur function (next elements)))))

A razão é que ao invés de fazer (not ( nil? valor)) podemos tentar transformar o valor em uma sequência, pois ai temos uma coisa bem interessante que é:

(println (next '(1))) ; O resultado associado é nil
(println (rest '(1))) ; O restulado associado é ()

(println (seq nil)) ; Seq de nil -> nil
(println (seq '())) ; seq de () -> nil

E dessa forma conseguimos garantir que caso não seja uma sequência interrompemos a execução :)

Fazendo alguns testes:

(meu-mapa println [ false 1 2 true 3 nil 4 5])

false
1
2
true
3
nil
4
5

E funciona corretamente :)

Abraços e Bons Estudos!