lo que se llama un átomo en Clojure es algo completamente diferente a lo que se llama un átomo en otros Lisps. En el clásico Lisp un átomo es un único valor, que se define como siendo no nulo o no una célula contras (par):
(define (atom? x)
(not (or (pair? x)
(null? x))))
En Clojure un átomo es un tipo de referencia de concurrencia. Los átomos en Clojure pueden ser de un solo valor o colecciones/secuencias, donde la actualización (cambio de estado mutable) se garantiza que ocurrirá atómicamente.
En Clojure hay muchos más tipos de referencia que la lista de contraseñas en Lisp, y hay todos los tipos de colección de interoperabilidad de Java a tener en cuenta. Eso hace que sea difícil definir una verificación en valores individuales.
Si lo desea, la comprobación más simple es ver si se puede contar algo. Mirando (source counted)
, hace referencia a clojure.lang.RT/count y countFrom. Allí, varias clases/interfaces se especifican, que he incluido en la función siguiente:
=> (defn single-valued?
[x]
(not (or (nil? x)
(.. x getClass isArray)
(some #(instance? % x) [clojure.lang.Counted
clojure.lang.IPersistentCollection
java.util.Collection
java.util.Map]))))
=> (map single-valued? [1 "foo" \a 'x true not nil])
(true true true true true true false)
=> (map single-valued? ['(1 2 3 4)
[1 2 3 4]
{:a 1 :b 2}
#{1 2 3 4}
(seq [1 2 3 4])
(seq {:a 1 :b 2})
(seq "foo")
(int-array [1 2 3 4])
(seq [])])
(false false false false false false false false false)
Desde (seq [])
evalúa a nil
no se considera de valor único. Por supuesto, los objetos java con múltiples campos, así como los deftypes/defrecords de Clojure se registrarán como tales, aunque sean objetos compuestos.
Si 'átomo de' no es una función, ¿por qué 'lista?' es? Puedo usar 'list?' Como una función y funciona, pero 'atom?' No. Todo esto parece muy sospechoso ... – Zchpyvr
@Zchpyvr 'list?' No es simplemente "como" una función, sino que _es_ una función explícitamente implementada en la biblioteca estándar y documentada en http://clojure.org/cheatsheet; 'átomo?' no lo es. –