2024年Clojure调查问卷!中分享您的想法。

欢迎!请参阅关于页面,了解此处的更多信息。

0
ClojureScript

这归因于ClojureScript的REPL的read-then-print处理了从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}

这个问题可能是描述在(link: 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就是这样一种映射 - 它简单地实现为一个键值键值...的数组。因此,它具有线性查找性能,只适用于非常小的映射。它实现了完整的映射接口。可以使用数组映射功能创建新的ArrayMap。请注意,只有在使用时保持排序顺序。随后的关联将会最终导致它成为一个哈希映射。


这个片段一直存在我记忆中的时间;而且这个特殊功能有时会出现在线讨论中。{{array-map}}(核心函数)的文档字符串明确承诺在Clojure和ClojureScript中构建array映射。

至于手头的问题,我认为这是一个非常小的问题(因此“轻微”优先级),但它确实存在——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 报告)
...