Clojure 我在用atom吗?错了,还是有别的事。。。。?

Clojure 我在用atom吗?错了,还是有别的事。。。。?,clojure,compiler-errors,Clojure,Compiler Errors,基本上 =>(atom?5) CompilerException java.lang.RuntimeException:无法解析符号:atom?在此上下文中,编译:(无源路径:1) =>(原子?/a) RuntimeException无效令牌:/a clojure.lang.Util.RuntimeException(Util.java:156) RuntimeException不匹配的分隔符:)clojure.lang.Util.RuntimeException(Util.java:156)

基本上

=>(atom?5)

CompilerException java.lang.RuntimeException:无法解析符号:atom?在此上下文中,编译:(无源路径:1)

=>(原子?/a)

RuntimeException无效令牌:/a clojure.lang.Util.RuntimeException(Util.java:156)
RuntimeException不匹配的分隔符:)clojure.lang.Util.RuntimeException(Util.java:156)

=>(atom?“你好,世界”)

CompilerException java.lang.RuntimeException:无法解析符号:atom?在此上下文中,编译:(无源路径:1)

有人知道发生了什么吗??
我正在使用EclipseJuno4.2,一个逆时针方向的插件

原子?这不是一个函数

你可以用

(def x (atom 5))
(instance? clojure.lang.Atom x)

我怀疑您在scheme之类的东西中将clojure
atom
atom
混淆了

  • 在这个方案中,原子是一个基本单位
  • 在clojure中,原子是clojure的引用类型之一(如ref和var),可以进行原子更新
这非常符合clojure的并发模型

e、 g


Clojure中的原子与其他Lisp中的原子完全不同。在经典Lisp中,atom是单个值,定义为不为null或不是cons单元格(对):

在Clojure中,atom是一种并发引用类型。Clojure中的原子可以是单值的,也可以是集合/序列,其中更新(可变状态更改)保证以原子方式进行

在Clojure中,引用类型比Lisp中的cons列表多得多,所有Java互操作集合类型都需要考虑。这使得很难对单个值定义检查

如果你真的想,最简单的检查就是看看是否有东西可以数出来。查看
(源计数)
,它引用/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都将注册为这样的对象,即使它们是复合对象。

您可以创建atom吗?功能如下:

   (defn atom? [x]
          (not (coll? x))
    )

complete
函数返回作为参数传递给它的任何谓词的相反项,因此您可以使用它生成一个
atom?

(defn atom?
  [x]
  ((complement coll?) x))

(atom? []) ;=> false
(atom? ()) ;=> false
(atom? {}) ;=> false
(atom? 4) ;=> true

如果
atom?
不是函数,为什么
list?
是函数?我可以像使用函数一样使用
list?
,但
atom?
不行。这一切似乎都很可疑…@Zchpyvr
list?
不仅仅是一个“类似”的函数,而是一个在标准库中显式实现的函数,并在<代码>原子?不是。
   (defn atom? [x]
          (not (coll? x))
    )
(defn atom?
  [x]
  ((complement coll?) x))

(atom? []) ;=> false
(atom? ()) ;=> false
(atom? {}) ;=> false
(atom? 4) ;=> true