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