2

気になったのでswapのソースコードを調べてみました!clojure リポジトリで関数を実行すると、次のようになりました。

(defn swap!
  "Atomically swaps the value of atom to be:
  (apply f current-value-of-atom args). Note that f may be called
  multiple times, and thus should be free of side effects.  Returns
  the value that was swapped in."
  {:added "1.0"
   :static true}
  ([^clojure.lang.Atom atom f] (.swap atom f))
  ([^clojure.lang.Atom atom f x] (.swap atom f x))
  ([^clojure.lang.Atom atom f x y] (.swap atom f x y))
  ([^clojure.lang.Atom atom f x y & args] (.swap atom f x y args)))

そして、「. swap」機能が何をしているのかわかりませんか? 検索しようとしましたが、同じファイルで定義されていないため、定義が見つかりません。それとも、これは実際には関数ではない別の特別なものですか?

4

3 に答える 3

0

簡単に言えば、アトムは sth です。つまり、トランザクション メモリの制御下にあります。(STM について読んでください。) オブザーバーにとっては不変です (アトムを逆参照すると、逆参照の時点で不変の状態が返されます)、トランザクション的に変更することができます。これはまさにスワップです!します。古い値を新しい値に交換します。課題とは大きく異なりますのでご注意ください。代入は並行性に対して安全ではありません。

つまり、atom はデータベース テーブルのセルのように機能します。クエリを実行すると、同じ瞬間に別のクエリがそれを更新している場合でも、例外ではなく値が得られます。

乾杯 -

于 2013-06-07T04:01:42.120 に答える