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

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

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方法构建集合,而不是创建持久化数组映射的文本来构建集合。无论有多少元素,文本表述都是错误的。

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
参考:[CLJS-1587](https://clojure.atlassian.net/browse/CLJS-1587) (由 mfikes 报告)
...