请分享您的想法,参加 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))
clojure.core.logic.LVar 的 StackOverflowError (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: no way to make this non-stack consuming w/o a lot more thinking
;; we could use continuation passing style and trampoline
IWalkTerm
(walk-term (link: v f)

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