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

欢迎!欲了解更多关于如何操作的详细信息,请参阅关于页面。

+1 投票
编译器
已关闭

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

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

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

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

1 答案

0 投票

是否存在某种与此相关的场景?

by
Clojure有很多方法会返回一个懒序列(lazy-seq),因此在对空集合使用quote时可能会出现此问题。例如:`'(quote ~(map a b))'。

我使用lazy-seq直接编写上述示例,以创建一个最小测试案例。
by
我不知道有人遇到过这个问题,所以我真的很想知道有人(比如您)何时可能真正遇到过这种情况。
by
有没有这种场景在不涉及eval的情况下会引起问题?因为eval在Clojure的生产代码中极其罕见。
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
谢谢,这个很有帮助。
...