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

欢迎!请查看关于页面以了解更多有关如何使用本站的信息。

0
ClojureScript

这是由于JS环境返回的返回值字符串表示形式的{{cljs.repl}}读取-打印处理造成的。截至版本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,中看到,它说


ArrayMaps
当进行代码表单操作时,有时需要有一个保持键顺序的映射。数组映射就是这样的一种映射 - 它只是以键值键值...的数组形式实现。因此,它具有线性查找性能,并且仅适用于非常小的映射。它实现了完整的映射接口。可以使用array-map函数创建新的数组映射。注意,数组映射只有在未'修改'时才保持排序顺序。后续的assoc-ing最终会使其'变成'散列表。


这个片段我记得一直存在;这个特定功能偶尔会出现在网络讨论中。{{array-map}}(核心函数)的docstrings对其承诺构建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报告)
...