Boucler sur les vecteurs
Je suis nouveau sur Clojure et ont constaté que lorsque je boucle sur ce vecteur en clojure à l'aide d'une compréhension de liste-je obtenir certains nil
s à la fin.
(def myVec [1,2,3])
user=> (for [x myVec] (println x))
(1
2
3
nil nil nil)
J'obtiens la même chose à l'aide de map
user=> (map println myVec)
(1
2
3
nil nil nil)
Quelles sont les causes de la nill à être imprimées dans ces cas?
à l'aide de (macro [x myVec] (println x))
OriginalL'auteur Jim Jeffries | 2011-12-16
Vous devez vous connecter pour publier un commentaire.
Ceux
nil
sont la valeur de retour deprintln
. Chaque fois que vous appelezla
println
fonction imprimesomething
sur la sortie standard, puis retournenil
. L'effet global dans votre code que vous voyez tous les effets secondaires (I/O) de tous lesprintln
invocations, puis le REPL imprime la valeur de retour de chacun et de chaque appel (par exemple, trois foisnil
).OriginalL'auteur skuro
for
etmap
créer un nouveau paresseux séquence avec tous les éléments dans le vecteur d'origine remplacé par le résultat de (println element
), etprintln
retourne nil.Vous ne devriez pas utiliser
for
etmap
pour effectuer des effets secondaires (comme l'impression) sur les éléments. Utilisationdoseq
.Les choses que vous dites sont vaguement vrai, mais faux dans la plupart des détails. Choses viennent dans le "mauvais" parce que la séquence est mémorisé en bloc, non pas parce que le repl imprime effets secondaires avant de valeurs: si vous aviez une unchunked séquence comme
(take 10 (iterate #(inc (doto % println)) 0))
, vous pouvez voir les valeurs de retour entrelacés avec des résultats d'impression. De même, si vous aviez une liste plus gros qu'un seul morceau (par exemple, de la taille 50), vous obtenez un tas de copies, puis un groupe de valeurs, puis de plus en plus des empreintes...C'est instructif. L'essentiel de ce que je disais, c'est que vous ne pouvait pas vraiment prévoir l'ordre dans lequel les choses ont été imprimés, mais même cela aurait été inexact compte tenu de la segmentation de vous voir ici. Comme il est, j'ai pris conscience de chunking il y a quelques jours.
OriginalL'auteur Joost Diepenmaat
nil
est la valeur retournée par println donc, vous voyez l'imprimé de lignes, suivi par le mappé liste de néant valeurs.OriginalL'auteur Lee