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

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

0
ClojureScript

这是由于{{cljs.repl}}对来自JS环境的返回值的字符串表示进行“先读取后打印”的处理所导致的。截至版本2371,相关代码片段位于此处

https://github.com/clojure/clojurescript/blob/r2371/src/clj/cljs/repl.clj#L156

演示此问题的更大代码片段

ClojureScript:cljs.user> (array-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18) {1 2, 3 4, 5 6, 7 8, 9 10, 11 12, 13 14, 15 16, 17 18} ClojureScript:cljs.user> (array-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21) {7 8, 1 2, 15 16, 13 14, 17 18, 3 4, 11 12, 9 10, 5 6} ClojureScript:cljs.user> (seq (array-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18)) ([1 2] [3 4] [5 6] [7 8] [9 10] [11 12] [13 14] [15 16] [17 18]) ClojureScript:cljs.user> (hash-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18) {7 8, 1 2, 15 16, 13 14, 17 18, 3 4, 11 12, 9 10, 5 6}

这个问题似乎是最可能导致描述在(链接:http://stackoverflow.com/questions/26349324/clojurescript-array-map-order 文本:这个StackOverflow问题)中描述的问题。最好以“预期”的方式打印有序集合,以防止用户困惑。

7 答案

0

评论者:dnolen

Clojure是如何处理的?

0

评论者:michalmarczyk

内置的REPL会简单地打印值的字符串表示,而不会首先尝试将它们读回来。

0

评论者:dnolen

REPL评估的结果是一个字符串,与Clojure不同,为了在ClojureScript REPL中得到正确的打印,似乎有必要读取返回的结果。我必须说,关于 {{array-map}} 任何关于顺序的承诺对我来说都不太清楚。

0
_由 michalmarczyk 发布的评论_

是的,看看 https://clojure.org/data_structures, 其中提到


数组映射
在执行代码形式操作时,往往希望有一个保持键顺序的映射。数组映射就是这样的映射 - 它简单实现为一个键值键值...数组。因此,它具有线性查找性能,并且只适用于非常小的映射。它实现了完整的映射接口。可以使用 array-map 函数创建新的数组映射。请注意,只有在不 '修改' 的情况下,数组映射才会保持排序顺序。随后的 assoc-ing 会导致它最终变成散列映射。


这个片段存在的时间跟我记得的一样长;这个特定的功能有时会在各种在线讨论中出现。对于 {{array-map}}(核心函数)的文档字符串在构造数组映射的承诺上是明确的,无论是在Clojure还是ClojureScript中。

至于手中存在的问题,我认为这确实是一个非常小的问题(因此是“不重要”的优先级),但它是真实的——REPL打印的表示与 {{pr-str}} 在相同的值上返回的字符串不匹配。事实上,修复这个问题的一种方法是在CLJS侧使用 {{pr-str}} 表示。然而,这里可能有些复杂的因素,我们不得不解决。
0

评论者:dnolen

感谢指出API承诺。好吧,我确实没有好的想法来做这件事,但欢迎使用不是很丑陋的补丁 :)

0

由 mfikes 发布的评论

我认为这个问题是不可复制的。例如,{{(apply array-map (range 100))}} 是以有序方式打印的。而且,在 {{repl.cljc}} 中也不再调用 {{read-string}}。

0
参考: https://clojure.atlassian.net/browse/CLJS-872 (由 michalmarczyk 报告)
...