Clojure 2024 情况调查!分享您的看法。

欢迎!请参阅关于页面了解这个网站的工作方式。

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 (logic.clj:1307) 的 StackOverflowError
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
参考:https://clojure.atlassian.net/browse/LOGIC-99(由dnolen报告)
...