To, co nazywane jest atomem w Clojure, jest czymś zupełnie innym niż to, co nazywamy atomem w innych Lispach. W klasycznym Lispie atom jest pojedynczą wartością, określony jako niezerowy czy komórka wad (para)
(define (atom? x)
(not (or (pair? x)
(null? x))))
w Clojure atom jest oznaczenie typu współbieżności. Atomy w Clojure mogą być jednowartościowe lub kolekcje/sekwencje, gdzie gwarantowane jest przeprowadzanie aktualizacji (zmiana stanu zmiennego) atomowo.
W Clojure jest znacznie więcej typów referencji niż lista minusów w Lispie, a wszystkie typy kolekcji interopowych Java są liczone. To sprawia, że trudno jest zdefiniować kontrolę pojedynczych wartości.
Jeśli chcesz, najprostszym sprawdzeniem jest sprawdzenie, czy coś można policzyć. Patrząc na (source counted)
, odwołuje się do clojure.lang.RT/count i countFrom. Istnieje kilka klas/interfejsy są określone, które zawarte w poniższej funkcji:
=> (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)
Od (seq [])
ocenia się nil
to nie jest uważane za jedną wartość. Oczywiście obiekty java z wieloma polami, jak również Clojure defpyes/defrecords będą się rejestrować jako takie, nawet jeśli są obiektami złożonymi.
Jeśli 'atom' nie jest funkcja, jak to jest 'list?' jest? Mogę użyć 'list?' Jak funkcji i działa, ale 'atom?' Nie. To wszystko wydaje się bardzo podejrzane ... – Zchpyvr
@Zchpyvr 'list?' Nie jest jedynie "podobną" funkcją, ale _jest_ funkcją jawnie zaimplementowaną w standardowej bibliotece i udokumentowaną na http://clojure.org/cheatsheet; "atom?" nie jest. –