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

这两个问题的根本问题相同,即直接使用 PersistentHashSet 和 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"}

我认为一个可能的解决方案,可以解决引用和char/string问题,是在{{cljs.compiler}}中调用{{emit-str}}的keys/set-members,然后检查唯一性。但不肯定这真的是个好主意。

没有解决{{hash-set}}、{{array-map}}宏。

编辑:相关任务:CLJS-2087

0票数

评论人:dnolen

扩大任务范围不可取。请将其移动到单独的任务并交叉引用,谢谢。

0票数

评论人:mfikes

补丁不再适用。

0票数
...