请在2024 Clojure状态调查!分享您的看法。

欢迎!有关此功能的更多信息,请参阅关于页面。

0
ClojureScript

用于

`

{1 '1}

`

你得到

`

{1 1}

`

9 答案

0

评论者:spinningtopsofdoom

这在has-set宏和hash-set文字中发生。这是我从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

这两个问题的根本问题是相同的,即在直接使用PersistentArrayMap作为{{PersistentHashSet}}的键来构建时出现了问题。但这体现在两个地方。

0

评论者:rohitaggarwal

我采取的办法是,如果看到引用的常量,那么就不直接创建 {{PersistentHashSet}},而是通过 {{fromArray}} 函数来进行。

补丁已经包含修复和测试。

0

评论者:mfikes

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

0

评论者:aralo

如果能在这个补丁/任务中加入以下情况就更好了

(hash-set "a" \a)

0

评论者:aralo

我们应该扩大这个任务的范围吗?对于 maps 同样存在相同的问题

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

我认为一种可能的解决方案,可以解决引用和字符/字符串的问题,是在 {{cljs.compiler}} 上对 keys/set-members 调用 {{emit-str}},然后再检查唯一性。不过,我不确定这是否是一个好主意。

这并不能解决 {{hash-set}}、{{array-map}} 宏。

编辑:相关任务:CLJS-2087

0

评论者:dnolen

扩大任务的范围是不希望的。请将其移动到单独的问题中,并使用交叉引用,谢谢。

0

评论者:mfikes

补丁不再适用。

0
参考:[https://clojure.atlassian.net/browse/CLJS-1587](https://clojure.atlassian.net/browse/CLJS-1587)(由mfikes报告)
...