我很好奇,所以我检查了交换的源代码!在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)))
Run Code Online (Sandbox Code Playgroud)
我不知道" .swap "功能在做什么?我试图搜索它,但它没有在同一个文件中定义,所以无法找到它的定义.或者这是另一个特别的东西,实际上根本不是一个功能?
Clojure中的很多东西实际上是用Java实现的,比如引用类型(atom,ref,var,agent),数据结构(map,vector,list,set),名称空间(实际Namespace类)和其他东西.在阅读Clojure函数的源代码时,clojure.core发现对Java方法的互操作并不罕见.
据我了解,有一个长期的目标,以实现这些东西的Clojure本身(搜索这里为Clojure的功能于Clojure的),但现在这些东西都实施了Java,这实在是没有那么糟糕,因为整个语言是开源你可以在github repo中在线查看任何实现细节(已在评论中链接):Clojure(注意有一个jvm和一个clj文件夹,用于指示内部代码的实现语言).
在Clojure中,表达式(.x object a b c)导致一个方法调用,在Java中表示为object.x(a, b, c).有关更多详细信息,请参阅Java Interop.
在这种特殊情况下,该swap!函数调用作为第一个参数传递swap的clojure.lang.Atom实例的适当重载方法.该swap方法包含执行交换的实际逻辑.
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |