【发布时间】:2015-10-21 15:52:53
【问题描述】:
只是想知道为什么with-open 不强制评估LazySeq 而prn 却强制执行?
with-open 专门用于做副作用,在 with-open 内部做一些事情会产生一些懒惰的东西以供以后可能的消费,这不是一个坏主意吗?在什么情况下你会这样做?
【问题讨论】:
标签: clojure io lazy-evaluation side-effects
只是想知道为什么with-open 不强制评估LazySeq 而prn 却强制执行?
with-open 专门用于做副作用,在 with-open 内部做一些事情会产生一些懒惰的东西以供以后可能的消费,这不是一个坏主意吗?在什么情况下你会这样做?
【问题讨论】:
标签: clojure io lazy-evaluation side-effects
两者的用途完全不同。 prn 是一个函数,专门设计用于以读者可以阅读的方式打印内容。如果要打印的内容恰好是惰性序列,则唯一要做的就是强制评估惰性序列以打印其内容。
with-open 是一个通用的宏,旨在在代码完成后资源关闭的上下文中执行其主体中的任意代码。它本质上是语法糖。宏不知道其主体中的代码正在做什么,或者它将产生什么样的结果。
您是正确的,从 with-open 返回试图从已经关闭的资源中读取的惰性序列是 Clojure 程序中常见的错误来源。但是,with-open 宏无法可靠地检测其主体何时导致产生惰性序列并自动强制它。你必须意识到这种情况,并在它出现时在你自己的代码中处理它。
【讨论】:
with-open,您可以在其中看到with-open 最终将body 包装在do 块中。