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,其中提到


ArrayMaps
在代码形式操作时,通常希望有一个保持键顺序的map。数组map就是这样一种map - 它由键值对的数组实现。因此,它具有线性查找性能,只适用于非常小的map。它实现了完整的map接口。可以使用array-map函数创建新的ArrayMaps。请注意,当未修改时,数组map将保持排序顺序。后续的assoc操作最终会使它成为一个hash-map。


这个片段在我能记得的任何时候都存在;这个特定功能偶尔出现在各种在线讨论中。对于{{array-map}}(核心函数)的文档字符串来说,它们在创建Clojure和ClojureScript中的数组map方面的承诺是明确的。

关于当前的问题,我认为这是一个非常小的问题(因此被标记为“次要”),但它确实存在 - 在REPL中打印的表示与using{{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 提报)
...