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: 没有更多的思维就无法使这非栈消耗型
;; 我们可以使用Continuation Passing Style和trampoline
IWalkTerm
(walk-term (link: v f)

(lcons (f (lfirst v))
       (f (lnext v))))
0
参考资料:https://clojure.atlassian.net/browse/LOGIC-99(由dnolen报告)
...