2024 Clojure 状态调查! 分享您的想法。

欢迎!请在 关于 页面了解更多关于如何工作的信息。

+5
打印

因为 clojure.core/pr-str 使用 with-out-str 来捕获 pr 的输出(pr 不能解析可写的东西 - 只使用 out)。

如果你懒惰对象的输出使用了 pr-str,你可以通过 println 控制打印标准输出中的副作用。例如,在我遇到的问题中,我正在从库 criterium 中提取基准测试,并尝试将数据结构打印到文件。解决方案是提供一个可接受 writers 的 pr/pr-str 覆载。我注意到 pr-on 提供了一些功能,但它现在是私有的。

这在你尝试将程序输出持久化在 EDN 中时是一个丑陋的错误,因为随机插入的 stdout 消息使它对于 read-string 无效。我们不需要我们的函数是纯净的,pr-str 才能按预期工作。

我省略了补丁,因为尽管我认为修复很简单,但我不确定它应该放在哪里(例如,使 pr-on 公开,更改 pr 或更改 pr-str)

5 个答案

0

由 stu 评论

作为一个修补程序,使用 print-dup 或 print-method

0

由 olical 评论

因此,我认为解决这个问题的方法是更改(链接:[https://github.com/clojure/clojure/blob/841fa60b41bc74367fb16ec65d025ea5bde7a617/src/clj/clojure/core.clj#L4702-L4709](https://github.com/clojure/clojure/blob/841fa60b41bc74367fb16ec65d025ea5bde7a617/src/clj/clojure/core.clj#L4702-L4709) 文本:pr-str)以使用(链接:[https://github.com/clojure/clojure/blob/841fa60b41bc74367fb16ec65d025ea5bde7a617/src/clj/clojure/core.clj#L3660-L3667](https://github.com/clojure/clojure/blob/841fa60b41bc74367fb16ec65d025ea5bde7a617/src/clj/clojure/core.clj#L3660-L3667) 文本:pr-on)与其自己的字符串写入器。这样,原本打算输出到out的内容仍然可以得到输出,如果用户真的想的话,他们可以在这个调用周围使用with-out-str。

我想不出为什么过去有人会依赖这个功能,但确实存在这样的风险:这可能会(链接:[https://xkcd.com/1172/](https://xkcd.com/1172/) 文本:打断某个人的工作流程)。我建议(如果我没有很好的理由不这样做,我将会提交一个补丁)我们将pr-str改为直接使用pr-on并带有字符串写入器,而不是默认的out。这意味着pr-str将不得不重实现变量参数处理,但我认为这没关系。

这样做的主要动机是,prepl使用pr-str来编码数据以通过套接字发送。这意味着我的(链接:[https://github.com/Olical/conjure](https://github.com/Olical/conjure) 文本:prepl工具)将捕获来自所有lazy-seq结果的out,因为pr-str在上游使用。对于这种情况的另一个解决方案是配置我的prepl不使用pr-str而使用我自己的函数,但我觉得那是回避问题。

我认为正确的做法是修复pr-str,我认为这种行为是不正确的或不可预期的,并且将来只会让更多的人感到困惑。再次,我很乐意尝试修复这个问题,但我想先听听您的想法。

0

由 olical 评论

我现在已经意识到所有p...-str函数都有相同的问题,目前正在考虑如何为所有它们解决这个问题。所以任何打印lazy-seq的输出都不会发送到out。也许我可以将这个问题分成不会发送到out但可以被单独重新定义的其他东西,而不使用with-out-str。

0

由 olical 评论

那么在任何传递给p...-str函数的lazy-seq上使用doall怎么样?无论怎样,它们都需要被完全解析,这样我们就可以在它们被包裹在with-out-str之前解析它们。我认为这意味着内部打印函数可以保持原样,而-str变体只需确保在打印之前解析这些序列。我认为这不会太大改变函数的特性,但会修复所有这些问题。

至少,消费者可以使用(pr-str (doall my-seq))来确保在pr-str中的with-out-str调用外部解析所有延迟性。这可以作为一个临时解决方案使用。

您的看法呢?

0
by
参考:[https://clojure.atlassian.net/browse/CLJ-1532](https://clojure.atlassian.net/browse/CLJ-1532)(由alex+import报告)
...