vi el siguiente ejemplo en el vídeo de Rich en las secuencias http://blip.tv/file/734409 unos 33-36 minutos en ella:En el desempeño de la función `first` de Clojure
(first "abcd") => \a
Ahora, ha dicho que este se expande a (tipo de):
(first "abcd") => (first (seq "abcd")) => (first '(\a \b \c \d))
Por lo tanto, parece que una operación O(N)
porque se está realizando la copia completa de la cadena. En primer lugar, si un String
es inmutable, ¿por qué se copia? (Editar: basado en una respuesta, probablemente no lo es, solo se veía de esa manera cuando se imprimía). En segundo lugar, suponga que first
operaba en otra cosa en Java que es mutable, digamos una lista de enteros enlazados. ¿Debería first
actuar de manera perezosa (por ejemplo, crear primero una secuencia persistente)? ¿No tendría sentido evaluarlo de inmediato y guardarlo? Sería una especie de truco que rompería la bonita abstracción, pero creo que hacer el trabajo rápido. Cuando llama al (seq "abcd")
, no sabe cómo se usará. Cuando llama a first
en un seq
, sabe qué hacer. Pero, cuando llame al first
en "abcd"
, creo que es mejor realizar un enfoque "agarrar y guardarlo" rápido y hacky que tomar una secuencia y llamar al first
.
¿Echo de menos algo? Hizo Rich Hickey saltarse algunos pasos?
Deseo saber si tengo preguntas. ¡Gracias!
Gracias, ¿alguna otra entrada sobre el trabajo con objetos Java mutables que se pueden convertir en una secuencia? –
IIRC, seq de llamada devuelve una secuencia de Clojure perezosa respaldada por un iterador de Java sobre la colección. Entonces, a medida que se realiza la secuencia floja, necesita seguir todas las reglas que pertenecen a los iteradores (en lo que respecta a la mutación del objeto subyacente) Una vez que se ha realizado, sin embargo, es una secuencia de Clojure inmutable. – levand
@Hamish: si quisiera convertir un objeto Java mutable en una secuencia, entonces necesitaría hacer una copia defensiva con un costo de O (n) o arriesgarse a que los datos subyacentes pudieran ser cambiados (lo que violaría las expectativas normales de seq) comportamiento y tal vez causar errores sutiles). El enfoque anterior (copia) es probablemente preferible, este último es muy peligroso a menos que esté absolutamente seguro de que nada cambiará en el momento equivocado. – mikera