请在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票数
by

评论者:rohitaggarwal

我采取了一种方法,如果我们看到一个带引号的常量,那么不要直接创建{{PersistentHashSet}},而是通过{{fromArray}}函数来实现。

补丁包括了修复和一个测试。

0票数
by

评论由:mfikes 提供

附加的补丁不再适用于master。

0票数
by

评论由:aralo 提供

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

(hash-set "a" \a)

0票数
by

评论由:aralo 提供

我们应该扩大这个工单的范围吗?同样的問題存在于map中

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

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

这并不解决{{hash-set}}、{{array-map}}宏的问题。

编辑:相关工单:CLJS-2087

0票数
by

评论由:dnolen 提供

扩大工单的范围是不可取的。请将其移至单独的问题,并进行交叉引用,谢谢。

0票数
by

评论由:mfikes 提供

补丁不再适用。

0票数
...