101 votes

Comment convertir une séquence paresseuse en non paresseux dans Clojure

J'ai essayé ce qui suit dans Clojure, en espérant avoir la classe d'une séquence non lazy retournée:

 (.getClass (doall (take 3 (repeatedly rand))))
 

Cependant, cela retourne toujours clojure.lang.LazySeq . Je suppose que doall évalue la séquence entière, mais renvoie la séquence d'origine car elle est toujours utile pour la mémorisation.

Alors, quel est le moyen idiomatique de créer une séquence non paresseuse à partir d'une séquence paresseuse?

170voto

Rich Hickey Points 706

Doall est tout ce dont vous avez besoin. Ce n'est pas parce que seq est de type LazySeq qu'il est en attente d'évaluation. Les seqs paresseux cachent leurs résultats, il ne vous reste donc plus qu'à parcourir le seq paresseux une fois (comme le fait tout le monde) pour tout forcer et le rendre ainsi non paresseux. seq n'oblige pas toute la collection à être évaluée.

79voto

Arthur Ulfeldt Points 45059

C'est à un certain degré une question de la taxonomie. un paresseux séquence est juste un type de séquence comme une liste, d'un vecteur ou d'une carte. Donc la réponse est bien entendu "cela dépend de quel type de non paresseux de la séquence que vous souhaitez obtenir:
Faites votre choix à partir de:

  • un ex-paresseux (entièrement évalué) paresseux séquence de (doall ... )
  • une liste pour un accès séquentiel (apply list (my-lazy-seq)) OR (into () ...)
  • un vecteur pour, plus tard, à accès aléatoire (vec (my-lazy-seq))
  • une carte ou un ensemble si vous avez certains à des fins spéciales.

Vous pouvez avoir quel que soit le type de séquence de la plupart des suites à vos besoins.

22voto

Peter Points 14647

Ce type riche semble connaître son clojure et a absolument raison.
Mais je pense que cet extrait de code, utilisant votre exemple, pourrait être un complément utile à cette question:

 => (realized? (take 3 (repeatedly rand))) 
false
=> (realized? (doall (take 3 (repeatedly rand)))) 
true
 

En effet le type n’a pas changé mais la réalisation a

5voto

stupito Points 29
(.getClass (into '() (take 3 (repeatedly rand))))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X