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 文本:这个StackOverflow问题)中描述的问题的主要原因。最好按“预期”的方式打印有序集合,以避免用户困惑。

7 个答案

0

评论由:dnolen

Clojure中如何处理这种情况?

0

评论由:michalmarczyk

内置REPL只是向* }打印值的字符串表示,而不会首先尝试将其读入。

0

评论由:dnolen

REPL计算的结果是一个字符串,与Clojure不同。为了获得ClojureScript REPL中适当的打印,看来有必要回读结果。我必须说我并不清楚这里有任何关于顺序的{{array-map}}承诺。

0
_由 michalmarczyk 撰写的评论_

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


ArrayMaps
在代码形式操作时,通常希望有一个保持键顺序的映射。ArrayMap就是这样一种映射——它只是简单地实现为一个键值数组键值键值...因此,它具有线性查找性能,只适用于非常小的映射。它实现了完整的映射接口。可以通过array-map函数创建新的ArrayMap。请注意,只有当未'修改'时,ArrayMap才会保持排序顺序。随后的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
参考:《[CLJS-872] Unable to install ClojureScript directly without Node.js》(由michalmarczyk报告)
...