基本上...
=> (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/

10-15 17:19