Zch*_*yvr 6 compiler-errors clojure
基本上...
=> (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插件.
Nie*_*lsK 12
Clojure中所谓的原子与其他Lisps中的原子完全不同.在经典Lisp中,atom是单个值,定义为非null或不是cons单元(pair):
(define (atom? x)
(not (or (pair? x)
(null? x ))))
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
由于(seq [])评估nil它不被视为单值.当然,具有多个字段的Java对象以及Clojure deftypes/defrecords将如此注册,即使它们是复合对象.
我怀疑你是在混淆一个Clojure中atom与atom在类似的方案.
这非常适合clojure的并发模型.
例如
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)
Run Code Online (Sandbox Code Playgroud)
原子?不是一个功能.
你可以用
(def x (atom 5))
(instance? clojure.lang.Atom x)
Run Code Online (Sandbox Code Playgroud)