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

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

0
ClojureScript

这是由于 ClojureScript 的 repl.clj 代码中的 {{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 文本:这个StackOverflow问题)中描述的问题的最可能原因。打印有序集合的"预期"方式将有助于防止用户混淆。

7 答案

0

评论者:dnolen

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

0

评论者:michalmarczyk

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

0

评论者:dnolen

REPL评估的结果是一个字符串,与Clojure不同的是,为了在ClojureScript REPL中得到正确的打印输出,似乎需要回读结果。我要说的是,我不太清楚{{array-map}} how 此处对顺序有什么保证。

0
_评论者:michalmarczyk_

是的,请参阅https://clojure.org/data_structures, 其中提到


ArrayMaps
在进行代码形式操作时,经常希望有一个维护键顺序的映射。数组映射就是这样一种映射 - 它仅作为一个键值键值...的数组实现。因此,它具有线性查找性能,并且仅适用于非常小的映射。它实现了完整的映射接口。可以使用array-map函数创建新的数组映射。请注意,当未'修改'时,数组映射将仅维护排序顺序。后续的assoc操作最终会导致它'变得'为一个哈希映射。


这个片段我一直记得,并且这个特定的功能偶尔会在各种在线讨论中出现。{{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 报告)
...