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

欢迎!请访问关于页面获取更多关于此功能的信息。

+1
编译器
已关闭

当 lazy-seq 传给引用时,我遇到了一个错误。以下是一个会导致问题的示例

`
user=> (eval `(quote ~(lazy-seq '(1 2 3))))
(1 2 3)

user=> (eval `(quote ~(lazy-seq '())))
语法错误 (UnsupportedOperationException) 在 (REPL:1:1) 编译 fn*。
未知集合类型

user=> (eval (quote ())) () ``

作为重复问题已关闭: 当评估空 lazy-seq 时产生错误

1 个答案

0

这种情况是否有关联的情景?

Clojure的许多方法将返回一个惰性序列(lazy-seq),因此如果在空集合上使用了quote,可能会导致这个问题。例如:`'(quote ~(map a b))'

我上面这个例子是直接使用惰性序列(lazy-seq)编写的,为了构造一个最小的测试用例。
by
我不记得有人遇到过这个问题,因此我更感兴趣的是当您(就像您一样的人)实际遇到这个问题的时候。
by
这种情况下是否存在除eval之外的会导致问题的场景?因为在生产环境中的Clojure代码中,eval极其少见。
by
"(defmacro m [] `'~(keep (constantly nil) (range 10)))"也存在相同的问题。

我发现 `Compiler$EmptyExpr` 未能正确处理空序列(除空列表外)。可能这个区域周围的 Compiler 代码(见https://github.com/clojure/clojure/blob/6975553804b0f8da9e196e6fb97838ea4e153564/src/jvm/clojure/lang/Compiler.java#L2990-L2991)应该处理这些情况。
by 编辑 by
我有一个宏,它使用quote将一些数据记录到一个数据结构中。这就像 "(defmacro m [x y] `(swap! global-data assoc ~(foo x) (quote ~(map bar y))))" 这样。
当"y"传递一个空向量时触发这个问题。

我目前通过将映射的懒序列强制转换为向量来解决这个问题。
"(defmacro m [x y] `(swap! global-data assoc ~(foo x) (quote ~(vec (map bar y)))))"
by
谢谢,这很有帮助。
...