Domanda

Il say-ciao-to-first-persona funziona bene, perché non dice-ciao-a-tutti?

(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"])
.

È stato utile?

Soluzione

vuoi doseq , "Foreach" di Clojure ":

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

map non funziona perché produce una sequenza pigra: finché non accetti effettivamente agli elementi nella sequenza (che non sei qui), nessuno di loro verrà valutato e gli effetti collaterali non si verificano.

.

Un'altra opzione è quella di forzare la valutazione convochevando dorun intorno al map.Pensando al motivo per cui questo funziona può aiutare la tua comprensione (anche se doseq è l'approccio idiomatico qui).

Altri suggerimenti

AS @edbond dice nel suo commento, map fn non valuta il momento necessario perché Map Fn restituisce un pigro seq.

Questo è il Doc di Mappa fn Restituisce una sequenza pigra costituita dal risultato dell'applicazione di F al Set di primi articoli di ciascun Coll, seguito dall'applicazione di F al set di secondi elementi in ogni coll, fino a quando nessuno dei colls è esausto.Eventuali articoli rimanenti in altri colli vengono ignorati.Funzione F dovrebbe accettare argomenti di numero di colls.

Se è necessario essere sicuri che i valori siano valutati in una parte specifica del tuo codice è possibile utilizzare fai o Dorun

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top