【问题标题】:why doesn't with-open force evaluation为什么不使用开放力评估
【发布时间】:2015-10-21 15:52:53
【问题描述】:

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

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

【问题讨论】:

    标签: clojure io lazy-evaluation side-effects


    【解决方案1】:

    两者的用途完全不同。 prn 是一个函数,专门设计用于以读者可以阅读的方式打印内容。如果要打印的内容恰好是惰性序列,则唯一要做的就是强制评估惰性序列以打印其内容。

    另一方面,

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

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

    【讨论】:

    • 你打败了我,得到了一个非常相似的答案。为了支持您所说的,可以查看source of with-open,您可以在其中看到with-open 最终将body 包装在do 块中。
    • 好的,谢谢。它标记了 IO 将发生的位置,并且没有在其中设置任何限制。如果有一个结构也能确保内部的严格性就好了,有人知道吗,有可能吗?
    猜你喜欢
    • 2014-05-19
    • 2019-05-24
    • 2015-03-15
    • 1970-01-01
    • 2011-10-11
    • 2014-06-17
    • 2021-11-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多