只是想知道为什么with-open
不强制评估LazySeq
而prn
呢?
with-open
专门用于做副作用,在with-open内做一些事情并不是一个坏主意,这会产生一些懒惰,以后可能消费?在什么情况下你会这样做?
答案 0 :(得分:4)
这两者完全不同。 prn
是功能,专门用于以读者可以阅读的方式打印内容。如果被打印的东西恰好是一个懒惰的序列,唯一要做的就是强制评估懒惰序列以打印其内容。
with-open
是一个通用的宏,旨在在完成代码时关闭资源的上下文中执行其正文中的任意代码。它基本上是语法糖。宏不知道它的身体代码在做什么,或者它将产生什么样的结果。
你是正确的,从with-open
返回试图从已经关闭的资源中读取的延迟序列是Clojure程序中常见的错误来源。但是,with-open
宏无法可靠地检测其身体何时导致生成延迟序列并自动强制它。您必须了解这种情况,并在出现时在您自己的代码中处理它。