是否有完整的Clojure核心模块的惰性函数列表?

象嘉道*_*象嘉道 3 clojure

经过一段时间与Clojure合作,我已经积累了一些关于它的懒惰的知识.我知道一个常用的API(例如map)是否是懒惰的.但是,当我开始使用不熟悉的API(例如with-open)时,我仍然感到怀疑.

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

Tim*_*ley 5

您可以通过打开Clojure代码https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj找到返回延迟序列的函数, 并搜索"返回懒惰"

我不知道有任何精选的清单.

经验法则是:如果它返回一个序列,它将是一个惰性序列,如果它返回一个值,它将强制进行评估.

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

在开放的情况下:

with-open macro用法:( with-open bindings&body)bindings => [name init ...]

在try表达式中计算body,其名称绑定到inits的值,并且finally子句以相反的顺序在每个名称上调用(.close name).

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

(with-open [r (io/reader "myfile")]
  (line-seq r))
Run Code Online (Sandbox Code Playgroud)

这是一个常见的陷阱.line-seq返回一个懒惰的序列!这里的问题是文件关闭后将实现延迟序列,因为文件在退出范围时关闭with-open.因此,您需要在退出with-open范围之前完全处理延迟序列.

我的建议是避免试图将你的程序视为"懒惰位"和"立即位",而只是要注意当涉及到io或副作用时,你需要在事情发生时做什么以及什么应该发生.