2010-12-16 16 views
6

Estaba leyendo en Practical Clojure (Capítulo 5) que la operación de la función rseq se ejecuta en tiempo constante. Me parece que debe ser una operación de tiempo lineal. ¿Alguien puede arrojar algo de luz sobre esto para mí?Clojure rseq en tiempo constante?

Respuesta

12

Prueba esto:

(class [1 2 3 4])

Verás:

clojure.lang.PersistentVector

Ahora intente esto:

(class (rseq [1 2 3 4]))

Y la secuencia de imp lementation es diferente:

clojure.lang.APersistentVector$RSeq

Como dijo Romano, que es una interfaz cambiada a una secuencia. Todos los elementos están donde estaban, solo está accediendo a ellos en orden inverso.

Se puede ver RSeq clase para ver cómo se implementa aquí: https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java

+0

¡Muchas gracias! Eso tiene sentido. –

3

No sé cómo se implementa, pero creo que solo devuelve algún objeto que implementa la interfaz de secuencia y sabe cómo recorrer la estructura (vector o mapa ordenado) en orden inverso. La secuencia de resultados es floja, por lo que no tiene que atravesar toda la estructura de inmediato.

0

devuelve la nueva interfaz en tiempo constante gusta Goran Jovic dijo, sino que se puede imprimir es lineal. Entonces mostrarlo en REPL es lineal, pero ponerlo en def es constante.

Cuestiones relacionadas