gpt4 book ai didi

clojure - 什么是 fn*,它与 fn 有什么不同?

转载 作者:行者123 更新时间:2023-12-03 00:26:17 26 4
gpt4 key购买 nike

我查看了lazy-seq的来源,我发现了这个:

Clojure 1.4.0
user=> (source lazy-seq)
(defmacro lazy-seq
"Takes a body of expressions that returns an ISeq or nil, and yields
a Seqable object that will invoke the body only the first time seq
is called, and will cache the result and return it on all subsequent
seq calls. See also - realized?"
{:added "1.0"}
[& body]
(list 'new 'clojure.lang.LazySeq (list* '^{:once true} fn* [] body)))
nil
user=>

我想知道 fn*fn 有何不同,但我似乎在文档中找不到任何对 fn* 的引用。我缺少什么,fn* 有何不同?

最佳答案

免责声明:我距离 Clojure 编译器专家还很远,因此请对以下内容持适当的态度。

fn*fn内在版本。 Clojure 的大部分功能都是用 Clojure 实现的,但一些底层功能是用 Java 实现的; fn* 就是其中之一。

fn 是根据 fn* 实现的。来源在这里:

https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L42

fn* 在编译器中实现:

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L47

实际上有两个不同版本的 fn*,在 Java 中通过符号 FNFNONCE 来引用。第一个是“裸”fn*,第二个是带有元数据 ^{:once true}fn*,这是版本由lazy-seq使用。

^{:once true} 用于让编译器知道包含该函数的闭包只会被调用一次,并且它可以执行封闭式局部清除。请参阅this mailing list thread了解更多详情。

关于clojure - 什么是 fn*,它与 fn 有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23586710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com