请在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作为函数调用会给出正确的结果。直到有超过8个元素,hash-set宏会给出错误的结果,并且使用PersistentHashSet的fromArray方法来构建集合,而不是创建持久化数组映射字面量集合。不论元素有多少,字面量表示都是错误的。

0

评论由:rohitaggarwal发表

两者背后的根本问题相同,即直接使用PersistentArrayMap创建了PersistentHashSet,其中的键是提供的序列中的元素。但这体现在两个地方。

0

评论由:rohitaggarwal发表

我已经采取了以下方法:如果我们看到一个引号常量,那么不要直接创建PersistentHashSet,而是通过fromArray函数进行转换。

补丁已修复,并进行了测试。

0
Jun 14, 2017

评论由:mfikes

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

0

评论由:aralo

如果这个补丁/工单也包含以下情况会很好

(hash-set "a" \a)

0

评论由:aralo

我们应该增加这个工单的范围吗?同样的问题存在于map中

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

我认为可能的一个解决方案,可以同时解决引号和字符/字符串问题,就是在{{cljs.compiler}}中调用{{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报告)
...