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,所有堆空间都被消耗
0 对 take-nth 是一个无效参数
即使那是不正确的,即使它产生一个无限的 nils 懒序列,我也不介意
但它并没有这样做,它积极地摧毁了 JVM
这是一个很糟糕的破坏性错误,让我花了一整天的时间来弄清楚发生了什么
请让某人修复它!

7 答案

0

评论人:importer

bhurt 说:在将此错误标记为无效之前,让我指出,这里的问题是(take-nth 0 任意列表)是一个没有意义的构造 - 问题在于当这种情况发生时应怎么做。在我看来,正确的做法是抛出异常。

0

评论人:importer

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

0
by

评论者:stu

调用(take-nth 0 ...)是否会导致问题,或者仅仅是意识到结果?

0
by

评论者:[email protected]

我没有看到任何问题。调用 take-nth 以及部分消耗返回的 seq 对于我来说都正常工作

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

但是请注意,它返回的是一个无限递归序列。问题描述中的示例似乎包括本质上 (doall ),这会导致堆溢出

(doall (range))

这个问题仍然让我觉得不合适。

0
by

评论者: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
by
参考: https://clojure.atlassian.net/browse/CLJ-291 (由 alex+import 报告)
...