为什么不进行开放式力量评估

时间:2015-07-30 10:25:59

标签: clojure io lazy-evaluation side-effects

只是想知道为什么with-open不强制评估LazySeqprn呢?

with-open专门用于做副作用,在with-open内做一些事情并不是一个坏主意,这会产生一些懒惰,以后可能消费?在什么情况下你会这样做?

1 个答案:

答案 0 :(得分:4)

这两者完全不同。 prn功能,专门用于以读者可以阅读的方式打印内容。如果被打印的东西恰好是一个懒惰的序列,唯一要做的就是强制评估懒惰序列以打印其内容。

另一方面,

with-open是一个通用的,旨在在完成代码时关闭资源的上下文中执行其正文中的任意代码。它基本上是语法糖。宏不知道它的身体代码在做什么,或者它将产生什么样的结果。

你是正确的,从with-open返回试图从已经关闭的资源中读取的延迟序列是Clojure程序中常见的错误来源。但是,with-open宏无法可靠地检测其身体何时导致生成延迟序列并自动强制它。您必须了解这种情况,并在出现时在您自己的代码中处理它。