请分享您的想法,参与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 方法来构建集合,而不是为集合创建一个字面值 PersistentArrayMap。无论元素有多少,字面表示法都是错误的。

0

评论者:rohitaggarwal

两者的根本问题相同,即使用了 PersistentHashSet 而不是 PersistentArrayMap 直接创建 PersistentHashSet,其中键是从提供的序列中获取的元素。但这在两个地方表现出来。

0

评论者:rohitaggarwal

如果我们在一个引号的常量中看到,那么不要直接创建 PersistentHashSet,而是通过 fromArray 函数进行转换。

补丁包含修复和一个测试。

0

评论者:mfikes

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

0

评论者:aralo

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

(hash-set "a" \a)

0

评论者:aralo

我们应该扩大这个工单的范围吗?对于map也存在同样的问题

{'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] (由mfikes报告)
...