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) {1 2, 3 4, 5 6, 7 8, 9 10, 11 12, 13 14} ClojureScript:cljs.user> (array-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} 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 文本:这一问题)描述的问题的最可能原因。打印有序集合的“预期”方式可以防止用户困惑。

7 回复

0

评论由:dnolen

Clojure是如何处理这个问题的?

0

评论由:michalmarczyk

内置的REPL仅将值的字符串表示打印到 * },而不会首先尝试读取它们。

0

评论由:dnolen

REPL求值的结果是一个字符串,与Clojure不同,为了在ClojureScript REPL中得到适当的打印输出,看起来有必要先回读结果。我会说,对我来说,array-map的确切顺序承诺并不明确。

0
_由 michalmarczyk 评论

是的,您可以在 https://clojure.org/data_structures, 中看到,其中写着


数组映射
在进行代码表单操作时,通常需要有一个维护键顺序的映射。数组映射就是这样一种映射 - 它 simply implemented as an array of key val key val... 因此,它具有线性查找性能,并且仅适用于非常小的映射。它实现了完整的映射接口。可以使用array-map函数创建新的数组映射。注意,只有当数组映射“未更改”(un-'modified')时,才会保持排序顺序。之后的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
by
参考: https://clojure.atlassian.net/browse/CLJS-872(由michalmarczyk报告)
...