clojure - ".swap"源代码中的 "swap!"有什么作用?

标签 clojure

我很好奇,所以我检查了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”函数是做什么的?我试图搜索它,但它没有在同一个文件中定义,所以找不到它的定义。或者这是另一个特殊的东西,实际上根本不是一个函数?

最佳答案

Clojure 中的很多东西实际上都是用 Java 实现的,比如引用类型(atom、ref、var、agent)、数据结构(map、vector、list) 、 set)、命名空间(实际的 Namespace 类)和其他东西。当阅读 clojure.coreClojure 函数的源代码时,经常会发现对 Java 方法的互操作调用。

据我了解,在 Clojure 本身中实现这些东西有一个长期目标(搜索 here for Clojure-in-Clojure),但目前这些东西是用 Java 实现的,这确实还不错,因为整个语言都是开源的,您可以在 github 存储库中在线检查任何实现细节(已在评论中链接):Clojure (请注意,有一个 jvm 和一个 clj 文件夹,指示其中的代码是用什么语言实现的)。

关于clojure - ".swap"源代码中的 "swap!"有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16971135/

相关文章:

clojure - 如何使 Clojure 中的 reduce 更具可读性?

clojure - 对 seq 的每个元素应用reduce

clojure - 试剂未注册原子表

clojure - 解释一下project.clj中的clojure依赖斜杠语法?

clojure - Clojure 中数字的绝对值

regex - Clojure中重新查找函数中的动态正则表达式参数

python - 结合 maybe 和 seq monads : confused at the output

clojure - Leiningen:如何在 project.clj 中定义常量?

f# - Clojure 与 F# 中的符号数学计算

clojure - 如何将 "expand"列表作为函数的参数?