2024年Clojure的现状调查!中分享你的想法。

欢迎!请参阅关于页面以了解更多关于此的工作信息。

0
Clojure

Collection类通过将 데려준 당신 {{toString}}-quay lại RT.printString, điều này lại ảnh hưởng đến giá trị của *

Clojure 1.9.0-beta1 user=> (binding [*print-readably* false] (str ["foo"])) "[foo]" user=> (binding [*print-readably* true] (str ["foo"])) "[\"foo\"]"

附加补丁通过用新的 RT.prString 方法调用替换集合 {{toString}} 实现中对 {{RT.printString}} 的调用,以显式绑定 *

有关原始报告的更多信息,请参阅https://groups.google.com/d/msg/clojure/S13swxLy1ng/FKLYdY9HAgAJ,它解释了由上述问题导致的 {{lazy-seq}}、{{print}} 和 {{str}} 之间的交互。

7 答案

0

有人评论:alexmiller

对我来说,目前的行为是否错误或是否不清楚?

0
注释:michalmarczyk

我会期望{{str}} / {{toString}}在应用于不可变元素的持久集合时是稳定的。换句话说,当应用于不可变输入时,我会期望它是一个显式传递的参数的纯函数。

用户确实没有其他方式可以预期任何对任何动态变量的依赖,或者是除了参数以外的其他东西,而参数是一个纯值。

在Google论坛的原始示例中,是一个Lazy Seq,表面上是一个值 -[(str ["a string")]),这取决于在创建它和调用(pr-str x)在它之间是否将其传递给(print x);它返回不同的{{pr-str}}(和{{打印方法}})表示。


Clojure 1.9.0-beta1
user=> (let [x (lazy-seq [(str ["a string"])])] (print x) (pr-str x))
([a string])"(\"[a string]"\")
用户=> (let [x (lazy-seq [(str ["a string"])])] (pr-str x))
"(\"[\\\"a string\\\"]\")"


这里用户可能预期 {{pr-str}} 调用与 {{print}} 调用独立,因为前者只在后者返回后才进行,但实际上存在一种神秘相互作用。

这个补丁修复了这个问题


Clojure 1.9.0-master-SNAPSHOT
user=> (let [x (lazy-seq [(str ["a string"])])] (print x) (pr-str x))
("[a string]")"(\"[\\\"a string\\\"]\")"
用户=> (let [x (lazy-seq [(str ["a string"])])] (pr-str x))
"(\"[\\\"a string\\\"]\")"
0

有人评论:alexmiller

这可能是一个哲学上的争论,我并不真的有一个确定的答案,但我很乐意来回讨论。:)

我同意持久的不可变值集合是一种价值。然而,有许多方式可以构建表示该不可变数据的字符串 - Clojure 打印系统中内置了几个(pprint、pr、print)+ 各种调节旋钮,如集合大小限制等。我看不出任何原理让我认为 toString 必须与选择该视图的调节旋钮独立。

换句话说,我并不一定认为这是一个需要解决的问题。

0

评论者:notespin

我认为这是有一点哲学性的。然而,为了加强补丁的一边,我认为 toString 和 str 通常被程序员期望是稳定的。所以我会说当前的行为违背了“最低惊讶原则”。我会投票支持使 str/toString 稳定,但话虽如此,这种变化可能会对某个人产生破坏性的变化,可能性很小。

0

有人评论:alexmiller

作为一位经验丰富的 Java 高手,我对 toString 没有期望。通常在 Java 中,它们建立在可变字段上,并且极端不稳定,所以我肯定不分享你的期望。:)

str 确实涉及“打印”(创建值的字符串视图)。我认为 str 是“稳定的”,但这并不是其显式输入的唯一函数(隐藏状态)。为了做一个类比,有许多方式可以从日期对象创建字符串,java.util.Date 的 toString 会使用你的时区格式化字符串,这是一种外部隐藏状态。

我并不一定反对这里的更改。我只是觉得这不是显然正确的做法。

从一般的角度来看,我认为“最低惊讶原则”意味着人们觉得惊讶的东西比实际存在的要多,所以我对此不太重视。我更重视从一些声明的原则中推导出的论点。我认为这个领域文档较少/定义不明确。

0

评论者:pbwolf

原始问题从 {{toString}} 开始。一个更直观的问题是,该问题表明 {{pr}} 生成 EDN 的不可靠性。

是否存在中间的 {{print-str}}(这与 {{pr}} 的调用者可能毫无关系)会产生实质性影响

`
user> (clojure.edn/read-string

    (first
      (clojure.edn/read-string
        (let [mk-str (fn [] (lazy-seq [(str ["ZiZi"])]))
              a (mk-str)]
          ;(print-str a)
          (pr-str a)))))

["ZiZi"]

user> (clojure.edn/read-string

    (first
      (clojure.edn/read-string
        (let [mk-str (fn [] (lazy-seq [(str ["ZiZi"])]))
              a (mk-str)]
          (print-str a)
          (pr-str a)))))

[ZiZi]
`

0
参考: https://clojure.atlassian.net/browse/CLJ-2248(由 michalmarczyk 提出)
...