6

基本的に...

=> (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)

だから誰かが何が起こっているのか知っていますか?CounterClockwiseプラグインであるEclipseJuno4.2を使用しています。

4

5 に答える 5

12

Clojureでアトムと呼ばれるものは、他のLispでアトムと呼ばれるものとはまったく異なるものです。従来のLispでは、アトムは単一の値であり、nullまたはconsセル(ペア)ではないと定義されています。

(define (atom? x)
  (not (or (pair? x)
           (null? x ))))

Clojureでは、アトムは同時実行参照型です。Clojureのアトムは、単一値またはコレクション/シーケンスのいずれかであり、更新(可変状態変化)がアトミックに発生することが保証されています。

Clojureには、Lispの短所リストよりもはるかに多くの参照型があり、考慮すべきすべてのJava相互運用機能コレクション型があります。そのため、単一値のチェックを定義するのは困難です。

必要に応じて、最も簡単なチェックは、何かを数えることができるかどうかを確認することです。を見ると、 clojure.lang.RT /countとcountFromを(source counted)参照しています。そこで、いくつかのクラス/インターフェースが指定されています。これを次の関数に含めました。

=> (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は、複合オブジェクトであっても、そのように登録されます。

于 2012-08-02T18:05:37.520 に答える
6

clojureatomatominのようなスキームを混同しているのではないかと思います。

  • スキームでは、原子は基本単位です。
  • clojureでは、アトムはclojureの参照型(refやvarなど)の1つであり、アトミックに更新できます。

これは、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)
于 2012-08-02T17:47:33.407 に答える
5

原子?関数ではありません。

あなたが使うことができます

(def x (atom 5))
(instance? clojure.lang.Atom x)
于 2012-08-02T17:21:47.053 に答える
1

あなたは原子を作ることができますか?このように機能します:

   (defn atom? [x]
          (not (coll? x))
    )
于 2016-10-23T09:27:47.057 に答える
0

このcomplement関数は、引数として渡された述語の反対を返すため、これを使用してを作成できますatom?

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

(atom? []) ;=> false
(atom? ()) ;=> false
(atom? {}) ;=> false
(atom? 4) ;=> true
于 2018-01-05T18:15:19.280 に答える