2024年Clojure状态调查中分享你的想法!

欢迎!请在关于页面查看有关如何使用本站的更多信息。

0
core.logic

(def l (range 0 2000)) (run* [q] (appendo l l q))

堆栈跟踪

`
user=> (def l (range 0 2000))

'user/l

user=> (run* [q] (appendo l l q))
StackOverflowError clojure.core.logic.LVar (logic.clj:1307)
user=> (pst)
StackOverflowError

clojure.core.logic.LVar (logic.clj:1307)
clojure.lang.KeywordLookupSite$1.get (KeywordLookupSite.java:45)
clojure.core.logic.LVar (logic.clj:1325)
clojure.lang.Util.equiv (Util.java:32)
clojure.lang.PersistentHashMap$BitmapIndexedNode.find (PersistentHashMap.java:601)

clojure.lang.PersistentHashMap$ArrayNode.find (PersistentHashMap.java:370)
clojure.lang.PersistentHashMap$ArrayNode.find (PersistentHashMap.java:370)
clojure.lang.PersistentHashMap.entryAt (PersistentHashMap.java:133)
clojure.lang.RT.find (RT.java:720)
clojure.core/find (core.clj:1432)
clojure.core.logic.Substitutions (logic.clj:1134)
clojure.core.logic/walk*/fn--2847 (logic.clj:1005)

`

3 答案

0

由dnolen发表的评论:

我在我的机器上无法重现,但是应该尝试一个大N并等待看看。

0

由norman发表的评论:

这个错误在我的机器上是5000次时发生的。我在LCons的walk-term(压栈的方法)实现中注意到了以下注释

;; TODO: 没有更多的思考,无法使这种实现非堆栈消耗型
;; 我们可以使用传递风格和trampoline
IWalkTerm
(walk-term (link: v f)

(lcons (f (lfirst v))
       (f (lnext v))))
0
...