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 是取第n个元素的无效参数
即使它会产生一个无限的nils序列,那也是错误的,但我不反对它
但它并没有这么做,而是积极地破坏了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 以及返回的 seq 的部分消费对我都正常工作

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

但是请注意,它返回了一个无限的懒 seq。问题描述中的示例似乎包括一个 (doall <infinite-lazy-seq>),这会导致 heap 内存耗尽

(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 报告)
...