gpt4 book ai didi

clojure - 有没有 Clojure 核心模块的惰性函数的完整列表?

转载 作者:行者123 更新时间:2023-12-02 12:10:10 28 4
gpt4 key购买 nike

使用 Clojure 一段时间后,我积累了一些关于它的惰性的知识。我知道诸如map之类的常用API是否是惰性的。然而,当我开始使用一个不熟悉的API(例如with-open)时,我仍然感到怀疑。

是否有任何文档显示 Clojure 核心模块的惰性 API 的完整列表?

最佳答案

您可以通过打开 Clojure 代码 https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj 来找到返回惰性序列的函数并搜索“返回一个懒惰的”

我不知道有任何精选的列表。

经验法则是:如果它返回一个序列,它将是一个惰性序列,如果它返回一个值,它将强制计算。

当使用新函数、宏或特殊形式时,请阅读文档字符串。大多数开发环境都有一个键来显示文档字符串,或者至少导航到源代码(您可以在其中看到文档字符串),并且总是有 http://clojure.org/api/api .

在with-open的情况下:

带开宏用法:(打开绑定(bind)和主体)绑定(bind) => [名称初始化 ...]

评估 try 表达式中的主体,名称绑定(bind)到值inits 的集合,以及一个在每个 init 上调用 (.close name) 的 finally 子句名称按相反顺序排列。

我们可以看到调用 with-open 的结果是对表达式进行求值并最终结束。所以我们知道这没有什么可偷懒的。然而,这并不意味着你不需要考虑 with-open 内部的惰性,恰恰相反!

(with-open [r (io/reader "myfile")]
(line-seq r))

这是一个常见的陷阱。 line-seq 返回一个惰性序列!这里的问题是,惰性序列会在文件关闭后实现,因为文件在退出with-open作用域时就被关闭了。因此,您需要在退出 with-open 作用域之前完全处理惰性序列。

我的建议是避免尝试将您的程序视为具有“惰性位”和“立即位”,而是要注意,当涉及 io 或副作用时,您需要注意事情发生时的情况:以及应该发生什么。

关于clojure - 有没有 Clojure 核心模块的惰性函数的完整列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35205503/

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