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

欢迎!请查看关于 页面了解有关本站工作方式的更多信息。

0
ClojureScript

对于

`

{1 '1}

`

您得到

`

{1 1}

`

9 个答案

0

评论由:spinningtopsofdoom 提供

这发生在 has-set 宏以及 hash-set 文 literal。这是我从 repl 得到的信息:

`
cljs.user=> (hash-set 1 '1 2 '2 3 '3 4 '4 5)

{1 2 3 4 5}

cljs.user=> (hash-set 1 '1 2 '2 3 '3 4 '4)

{1 1 2 2 3 3 4 4}

cljs.user=> #{ 1 '1 2 '2 3 '3 4 '4}

{2 1 4 4 3 2 1 3}

cljs.user=> #{ 1 '1 2 '2 3 '3 4 '4 5}

{2 1 4 4 3 2 5 1 3}

cljs.user=> #{ 1 '1 2 '2 3 '3 4 '4 5 '5}

{2 5 1 4 4 3 2 5 1 3}

cljs.user=> (apply hash-set [1 '1 2 '2 3 '3 4 '4])

{1 2 3 4}

`

将 hash-set 作为函数调用会得到正确的结果。hash-set 宏获得不正确的结果,直到元素超过8个,此时它使用 PersistentHashSet 的 fromArray 方法来构建集合,而不是为集合创建字面 PersistentArrayMap。无论元素有多少,字面表示都是不正确的。

0

评论由:rohitaggarwal 提供

这两个问题的根本问题相同,都是直接使用 <{{PersistentHashSet}}>,并通过 <{{PersistentArrayMap}}> 来构建,其键是提供的序列中的元素。但它体现在两个地方。

0

评论由:rohitaggarwal 提供

我采取的方法是:如果我们看到带引号的常量,则不直接创建{{持久哈希集合}},而是通过{{fromArray}}函数进行转换。

补丁已解决这个问题,并进行测试。

0

由:mfikes发表的评论

附上的补丁不再适用于master分支。

0

由:aralo发表的评论

如果这个补丁/工单也包括以下情况就更好了

(hash-set "a" \a)

0

由:aralo发表的评论

我们应该扩大这个工单的范围吗?相同的问题存在于对于maps中

{'0 "a", 0 "b"} {'\a "a", "a" "b"}}

我认为一个可能的解决方案可以同时解决引号和char/string问题,就是在{{cljs.compiler}}上调用{{emit-str}}在键/集合成员上,然后检查它们的唯一性。但不确定这是个好主意。

但不能解决{{hash-set}}, {{array-map}}宏。

编辑:相关工单:CLJS-2087

0

由:dnolen发表的评论

扩大工单的范围是不受欢迎的。请将其移动到单独的问题,并加以交叉引用,谢谢。

0

由:mfikes发表的评论

补丁不再适用。

0
by
...