Cómo convertir secuencias perezosas a no perezosas en Clojure


Answers

Esto es hasta cierto punto una cuestión de taxonomía. una secuencia floja es solo un tipo de secuencia, como una lista, un vector o un mapa. Entonces, la respuesta es, por supuesto, "depende del tipo de secuencia no lenta que desee obtener:
Elija entre:

  • una secuencia floja ex perezoso (totalmente evaluado) (doall ... )
  • una lista para el acceso secuencial (apply list (my-lazy-seq)) OR (into () ...)
  • un vector para acceso aleatorio posterior (vec (my-lazy-seq))
  • un mapa o un conjunto si tiene algún propósito especial.

Puede tener cualquier tipo de secuencia que la mayoría de las suites necesite.

Question

Intenté lo siguiente en Clojure, esperando tener la clase de una secuencia no lenta devuelta:

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

Sin embargo, esto todavía devuelve clojure.lang.LazySeq . Mi suposición es que doall no evalúa la secuencia completa, pero devuelve la secuencia original, ya que aún es útil para la memorización.

Entonces, ¿cuál es el medio idiomático de crear una secuencia no perezosa desde una floja?




Me encontré con esta blog este blog acerca de que no todos son recursivos. Para eso, encontré el primer comentario en la publicación que hizo el truco. Algo como:

(use 'closure.walk)
(postwalk identity nested-lazy-thing)

Encontré esto útil en una prueba unitaria donde quería forzar la evaluación de algunas aplicaciones anidadas del map para forzar una condición de error.