2011-02-28 9 views
6

De acuerdo con la impresionante página de tutoriales de Mark, "La función de mapa aplica una función dada que toma un parámetro para cada elemento en una colección, devolviendo una secuencia perezosa de los resultados".¿La función de mapa de clojure está ansiosa?

Sin embargo, cuando haga lo siguiente:

(def input-message-list (range 100 126)) 

(defn test-123 [in] 
    (println "doing " in) 
    (str "out " in)) 

(def output-test (map 
        test-123 
        input-message-list)) 

(first output-test) 

, en el REPL puedo conseguir los efectos secundarios println para toda la gama, no sólo el primer elemento!

¿Qué está pasando aquí, gente?

Respuesta

7

ya ha respondido en here:

como realmente son evaluados 32 elementos a la vez

Su gama tiene menos de 32 elementos.

3

Esto es parte de las secuencias fragmentadas que realmente ayudan al rendimiento del patrón "map over lazy seq" que es tan omnipresente en Clojure. De esta forma, su función de mapeo recibe muchas más llamadas sucesivas y se abre paso en la ruta rápida del compilador de punto de acceso JVM mucho más rápido. Cuando Rich hizo una demostración de esto en San Francisco en 2008, era increíble ver a estos dos trozos de código se ejecute a la misma velocidad:

(reduce + (map inc (range 10000))) 

y

(loop [i 0 sum 0] 
    (recur (inc i) (+ sum i))) 

Ahora se puede escribir clojure idiomáticas y obtener toda velocidad . si llega a ser un problema, puede desactivarlo here