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

欢迎!请在关于页面了解更多的详细信息。

+5
打印

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

如果你将某些惰性结果pr-str,你可以通过println将其与输出混合来获取写入标准输出的副作用。例如,在我这个例子中,我从库criterium提取基准,并尝试将数据结构打印到文件。解决方案将是为pr/pr-str提供一个接受写入器的重载。我注意到pr-on提供了一些功能,但它只是私有的。

当你试图在EDN中持久化程序输出时,这是一个丑陋的bug,因为随机插入的标准输出信息使得它对read-string无效。我们不应当需要在pr-str按预期工作的情况下使我们的函数纯洁。

我省略了一个补丁,因为我虽然认为修复很直接,但不确认应该在哪里(例如,将pr-on设为公开,更改pr,更改pr-str)。

5 个回答

0

由:stu发表的评论

作为修复方案,使用print-dup或print-method

0

由:ocal发表评论

因此,我认为解决这个问题的方法之一是将链接: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 文本:pr-on 以及其本身的字符串写入器。这样,打算输出到外面的东西还会到达那里,如果用户真的想这样做,他们可以将其包装在 with-out-str 中。

我想不出为什么有人过去会依赖这种功能,但这也可能打破某些人的工作流程(链接:https://xkcd.com/1172/ 文本:break someone's workflow)。我建议(如果没有合理的理由不这样做,我将会提交补丁)将 pr-str 修改为直接使用 pr-on 与字符串写入器,而不是默认的 out。这意味着 pr-str 将不得不重新实现 var args 处理,但我想这没关系。

主要的动机是,prepl 使用 pr-str 来编码数据以发送到套接字。这意味着我的链接:https://github.com/Olical/conjure 文本:prepl 工具)会捕获所有 lazy-seq 结果的 out,因为 pr-str 在上游使用。其他的修复方法可能是配置我的 prepl 不使用 pr-str,而使用我自己的函数,但我觉得这是回避问题。

我认为这里正确的事情是修复 pr-str,我认为这种行为既不正确也不符合预期,并且在未来只会让更多人上当。再次,我很乐意尝试修复这个问题,但在这么做之前,我想先听听您的想法。

0

由:ocal发表评论

我现在意识到所有 p...-str 函数都有这个问题,目前正在思考如何解决所有这些函数的问题。所以任何打印 lazy-seq 的输出将不会发送到 out。也许我可以将其分成这样,防止它发送到 out,而是发送到其他可以单独反弹的东西,而不使用 with-out-str。

0
a href screenings发展安文文文pow assortements�με�� lauriefirpo a href ">answer more help answers." href l..." href @"{"qa-a-item-what" "url"} организме direct用时 phrase"))>回复"href刘德华 problème class="qa-a-item-when" itemprop="dateCreated" datetime-de-numberoid"datetime=" linewidth" myfile赫默 datetime " closest 2019-04-22t 14:07:47 potassium ,");

由:ocal发表评论

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

至少,消费者可以使用 (pr-str (doall my-seq)) 来确保在 pr-str 中的 with-out-str 调用外部解决所有延迟。

看法如何?

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