请在 2024 年 Clojure 调查问卷! 中分享您的看法。

欢迎!请查看 关于 页面,了解更多关于此平台的信息。

+3
Clojure
似乎我无法使旧票据无效,所以我来试试
(take-nth 0 coll) 导致(至少在 Solaris 上)无限空间和时间消耗
这并非是打印错误,以下代码也会引起问题

(let [j 0
 firstprod (apply * (doall (map #(- 1 %) (take-nth j (:props mix)))))]) ;来自我的参数更新函数

我使用了jvisualvm,jvm 正在进行一些 RNI 调用 - 完全没有运行 clojure 代码
如果让它单独运行,它将耗尽内存导致 JVM 崩溃
对于 take-nth,0 是一个无效的参数
即使它会产生无限个 nil 的惰性序列(虽然这是错误的),我也不介意
但它并没有这样做,它实际上破坏了 JVM
这是一个讨厌的破坏性 bug,我花了半天时间才弄清楚发生了什么
请让某人修复它!

7 个答案

0

评论者:importer

bhurt 说:在将此错误标记为无效之前,我要指出,这里的问题是 (take-nth 0 any-list) 是一个没有意义的构造,关键问题是当这种情况发生时该怎么做。我认为正确的做法是抛出异常。

0

评论者:importer

ataggart 说:[链接:[文件:dfNhoS2Cir3543eJe5cbLA)]:在负步长上抛出 IllegalArgumentException。

0

由 stu 发布的评论

调用 (take-nth 0 ...) 是否会引起问题,或者仅仅是意识到结果 xảy ra?

0

[email protected] 发布的评论

我没有看到任何问题。调用 take-nth 以及返回的 seq 部分消费都对我没有问题

(take 5 (take-nth 0 (link: 1 2 3)))
;=> (1 1 1 1 1)

然而,它返回了一个无限惰性 seq。问题描述中的例子似乎基本上是 (doall ),这将耗尽堆栈

(doall (range))

这个问题仍然我认为无效。

0

由 richhickey 发布的评论

(take-nth 0 ...) 返回一个包含第一项的无限序列

(take 12 (take-nth 0 (link: 1 2 3)))
=> (1 1 1 1 1 1 1 1 1 1 1 1)

在 Solaris 上是否还有其他发生的事情?

0
参考: https://clojure.atlassian.net/browse/CLJ-291 (由 alex+import 报告)
...