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

欢迎!有关如何使用本页面的更多信息,请参阅关于页面。

+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的一个无效参数
即使它会生成一个无限的无用的nil序列,我也可以接受,即使这是错误的
然而,它没有这么做,它实际上破坏了JVM
这是一个糟糕的破坏性错误,我花了半天才明白是怎么回事
请有人修复它!

7 答案

0

评论者:importer

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

0

评论者:importer

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

0

评论者:stu

调用 (take-nth 0 ...) 是否会导致问题,或者只是发现结果时才会出现问题?

0

评论者:[email protected]

我没有看到问题。调用 take-nth 以及返回的序列的前一部分都能正常工作。

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

但是注意,它返回的是一个无限的延迟序列。问题说明中的示例似乎本质上是一个 (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 报告)
...