Pergunta

O dizer olá para a primeira pessoa funciona bem, por que não diz olá para todos?

(defpartial greeting [name]
  [:p.alert "Hello " name ", how are you?"])

(defn say-hello [name]
  (append $content (greeting name)))

(defn say-hello-to-first-person [names]
  (say-hello (first names)))

(defn say-hello-to-everyone [names]
  (map say-hello names))

(say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"])
(say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"])
Foi útil?

Solução

Você quer doseq, "foreach" de Clojure:

(doseq [name names]
  (say-hello name))

map não funciona porque produz uma sequência preguiçosa:Até que você realmente acesse os itens da sequência (o que não acontece aqui), nenhum deles será avaliado e os efeitos colaterais não ocorrerão.

Outra opção é forçar a avaliação agrupando dorun em volta do map.Pensar sobre por que isso funciona pode ajudar na sua compreensão (embora doseq é a abordagem idiomática aqui).

Outras dicas

Como @edbond diz em seu comentário, map fn não avalia até o momento necessário porque map fn retorna uma sequência lenta.

Este é o documento de mapa O FN retorna uma sequência preguiçosa que consiste no resultado da aplicação de F ao conjunto de primeiros itens de cada coll, seguido pela aplicação de F ao conjunto de segundos itens em cada coll, até que qualquer um dos colls esteja esgotado.Quaisquer itens restantes em outras colunas serão ignorados.Função F deve aceitar argumentos de número de collas.

Se você precisar ter certeza de que os valores são avaliados em uma parte específica do seu código, você pode usar fazer tudo ou dorun

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top