基本上...=> (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插件)。
最佳答案
Clojure中的原子与其他Lisps中的原子完全不同。在经典的Lisp中,原子是单个值,定义为非null或cons单元格(对):
(define (atom? x)
(not (or (pair? x)
(null? x ))))
在Clojure中,原子是并发引用类型。 Clojure中的原子可以是单值原子,也可以是集合/序列,其中保证原子发生更新(可变状态更改)。
在Clojure中,引用类型比Lisp中的cons列表要多得多,并且所有Java interop集合类型都是不容忽视的。这使得很难定义对单值的检查。
如果愿意,最简单的检查是查看是否可以计数。查看
(source counted)
,它引用了clojure.lang.RT/count和countFrom。在那里,指定了几个类/接口(interface),这些类/接口(interface)包含在以下函数中:=> (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也会这样注册,即使它们是复合对象。关于clojure - 我在使用原子吗?错误或还有其他问题...?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11782534/