Comportamiento de los transductores Clojure

Con el nuevo clojure 1.7 decidí entender dónde puedo usar transductores. Entiendo qué beneficio pueden dar, pero no puedo encontrar ejemplos normales de escribir transductores personalizados con explicación.

Ok, traté de probar lo que está sucediendo. Abrí la documentación de clojure. Y hay ejemplos de usoxf como argumento Primero: ¿qué significa esto xf o xfrom? Esto produjo un transductor de identidad.

(defn my-identity [xf]
  (fn 
   ([]
     (println "Arity 0.")
     (xf))
   ([result]
     (println "Arity 1: " result " = " (xf result)) 
     (xf result))
   ([result input]
     (println "Arity 2: " result input " = " (xf result input)) 
     (xf result input))))

Tomé el nombre de variables[result input] del ejemplo de documentación. Pensé que es como en la función reducir donderesult es parte reducida yinput Es un nuevo elemento de colección.

Entonces cuando hago(transduce my-identity + (range 5)) Obtuve resultado10 Lo que esperaba. Entonces leí sobreeduction, pero no puedo entender de qué se trata. De todos modos hice(eduction my-identity (range 5)) y consiguió:

Arity 2:  nil 0  =  nil
Arity 2:  nil 1  =  nil
Arity 1: nil  =  nil
(0 0 1 1)

Todos los artículos se duplicaron porque llamoxf enprintln declaración. ¿Por qué duplicó cada elemento dos veces? ¿Por qué tengo nada? ¿Siempre me quedaré sin nada mientras hago una educación? ¿Puedo transmitir este comportamiento?

De todos modos lo hice

> (reduce + (eduction my-identity (range 5))
clojure.core.Eduction cannot be cast to clojure.lang.IReduce

Ok, el resultado es unEduction eso NO es reducible, sino impreso como una lista. ¿Por qué no es reducible? Cuando escribo(doc eduction) Lo entiendo

Returns a reducible/iterable application of the transducers
to the items in coll.

No deberia(transduce xform f coll) y(reduce f (eduction xfrom coll)) ¿ser el mismo?

hice

> (reduce + (sequence my-identity (range 5))
20

Por supuesto que tengo20 por duplicados Nuevamente pensé que debería ser eso(transduce xform f coll) y(reduce f (sequence xfrom coll)) ser siempre igual al menos en un ejemplo tan pequeño sin ningún transductor con estado. ¿Es estúpido que no lo sean o me equivoco?

Ok, entonces lo intenté(type (sequence my-identity (range 5))) y obtener clojure.lang.LazySeq pensé, que es vago, pero cuando traté de tomar elfirst El elemento clojure calculó toda la secuencia a la vez.

Entonces mi resumen:

1) ¿Qué significa xf o xform?

2) Por qué me salenil como unresult argumento mientraseduction osequence?

3) ¿Podría estar siempre seguro de que seránil mientraseduction osequence?

4) Qué eseduction ¿Y cuál es la idea idiomática que no es reducible? O si es así, ¿cómo puedo reducirlo?

5) ¿Por qué tengo efectos secundarios mientrassequence oeduction?

6) ¿Puedo crear secuencias perezosas reales con transductores?

Respuestas a la pregunta(1)

Su respuesta a la pregunta