基本上...
=> (atom? 5)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: atom? in this context, compiling:(NO_SOURCE_PATH:1)
=> (atom? /a)
RuntimeException Invalid token: /a clojure.lang.Util.runtimeException (Util.java:156)
RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:156)
=> (atom? "hello world")
CompilerException java.lang.RuntimeException: Unable to resolve symbol: atom? in this context, compiling:(NO_SOURCE_PATH:1)
所以有人都知道发生了什么事吗? 我正在使用Eclipse Juno 4.2,CounterClockwise插件。
答案 0 :(得分:12)
Clojure中所谓的原子与其他Lisps中的原子完全不同。在经典的Lisp中,原子是单个值,定义为非空或不是cons单元(对):
(define (atom? x)
(not (or (pair? x)
(null? x ))))
在Clojure中,atom是一种并发引用类型。 Clojure中的原子可以是单值或集合/序列,其中更新(可变状态变化)保证以原子方式发生。
在Clojure中,引用类型比Lisp中的cons列表要多得多,而且还有所有需要考虑的Java互操作集合类型。这使得很难定义对单值的检查。
如果您愿意,最简单的检查是查看是否可以计算某些内容。查看(source counted)
,它引用了clojure.lang.RT / count和countFrom。在那里,指定了几个类/接口,我将其包含在以下函数中:
=> (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)
由于(seq [])
评估为nil
,因此不会将其视为单值。当然,具有多个字段的java对象以及Clojure deftypes / defrecords都会这样注册,即使它们是复合对象。
答案 1 :(得分:6)
我怀疑你在一个类似于方案的东西中混淆了atom
和atom
。
这非常适合clojure的并发模型。
e.g。
user> (def a (atom '(1 2 3)]); create an atom with value (1 2 3)
user> @a ; look up (deference) the atoms value
(1 2 3)
user> (swap! a (fn [v] (map inc v))) ; add 1 to each element, v is the
; old value of the atom. other threads will
; see the three values in a change atomically
user> @a
(2 3 4)
user> (reset! a '(5 10 15))
user> @a
(5 10 15)
答案 2 :(得分:5)
原子?不是一个功能。
您可以使用
(def x (atom 5))
(instance? clojure.lang.Atom x)
答案 3 :(得分:1)
您可以像这样创建 atom?函数:
(defn atom? [x]
(not (coll? x))
)
答案 4 :(得分:0)
complement
函数返回与作为参数传递给它的任何谓词相反的内容,因此您可以使用它生成atom?
:
(defn atom?
[x]
((complement coll?) x))
(atom? []) ;=> false
(atom? ()) ;=> false
(atom? {}) ;=> false
(atom? 4) ;=> true