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
这是一个讨厌的破坏性错误,查明原因花了我半天时间
请让某人修复它!

7 个答案

0

评论由:importer 提出

bhurt 说:在这个错误被标记为无效之前,我想指出的问题是:(take-nth 0 any-list) 是一个没有意义的构造——唯一的问题是当这种情况发生时应该怎么做。在我看来,正确的行为是抛出一个异常。

0

评论由:importer 提出

ataggart 说:(链接:[文件: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 报告)
...