Documentación para conj
(de clojure.org):
conj [oin]. Devuelve una nueva colección con el xs 'agregado'. (elemento conj nil) devuelve (elemento). La 'adición' puede ocurrir en diferentes 'lugares' dependiendo del tipo de hormigón.
Es más eficiente "agregar" elementos al final de un vector, mientras que es más eficiente hacerlo al principio de las listas. conj
usa lo que sea más eficiente para la estructura de datos que le proporcione.
En los ejemplos que das, '(1 2 3)
y (seq [1 2 3])
tanto implemento ISeq
(ver documentation for seq?
), mientras que [1 2 3]
no.
Clojure's conj
finalmente llama al método cons
(no debe confundirse con la función cons
- este método es código interno de clojure) en la estructura de datos subyacente; para vectores (PersistentVector
), cons
agrega elementos al final, mientras que para las listas se agregan al frente (el método cons
para PersistentList
s devuelve una nueva lista con el nuevo elemento como encabezado y la lista existente como su cola) .
He estado aprendiendo Clojure desde mayo de este año. Me pareció que profundizar en ejercicios como este era muy útil, especialmente teniendo en cuenta que nunca aprendí un lenguaje parecido a Lisp antes de Clojure. – octopusgrabbus