Una diferencia es que conjacepta cualquier número de argumentos para insertar en una colección, mientras que conssolo toma uno:
(conj '(1 2 3) 4 5 6)
; => (6 5 4 1 2 3)
(cons 4 5 6 '(1 2 3))
; => IllegalArgumentException due to wrong arity
Otra diferencia está en la clase del valor de retorno:
(class (conj '(1 2 3) 4))
; => clojure.lang.PersistentList
(class (cons 4 '(1 2 3))
; => clojure.lang.Cons
Tenga en cuenta que estos no son realmente intercambiables; en particular, clojure.lang.Consno implementa clojure.lang.Counted, por lo que un countsobre que ya no es una operación de tiempo constante (en este caso probablemente reduciría a 1 + 3 - 1 al proviene de recorrido lineal en el primer elemento, el 3 viene de (next (cons 4 '(1 2 3))ser PersistentListy así Counted).
La intención detrás de los nombres es, creo, que conssignifica construir una seq. 1 , mientras que conjsignifica conjugar un elemento en una colección. El seqser construido por conscomienza con el elemento pasado como primer argumento y tiene como su next/ restparte lo resultante de la aplicación de seqal segundo argumento; como se muestra arriba, todo es de clase clojure.lang.Cons. Por el contrario, conjsiempre devuelve una colección de aproximadamente el mismo tipo que la colección que se le pasó. (Aproximadamente, porque a PersistentArrayMapse convertirá en a PersistentHashMaptan pronto como supere las 9 entradas).
1 Tradicionalmente, en el mundo Lisp, conscontras (construye un par), por lo que Clojure se aparta de la tradición Lisp al hacer que su consfunción construya un seq que no tiene un tradicional cdr. El uso generalizado de conspara significar "construir un registro de un tipo u otro para mantener juntos un número de valores" es actualmente omnipresente en el estudio de los lenguajes de programación y su implementación; eso es lo que se quiere decir cuando se menciona "evitar la consulta".