gpt4 book ai didi

clojure - 为什么我得到一个stackoverflow?

转载 作者:行者123 更新时间:2023-12-04 17:57:39 25 4
gpt4 key购买 nike

我一直在玩 Clojure 并且我设法搞砸了堆栈。在这段代码中,我仅将递归与 recur 一起使用。我正在做很多连接(注意下面跟踪中对 concat 的调用)。我试图对所有连接列表进行操作,因为这些列表很懒惰,我希望它们在我进行时进行评估。我仍然得到堆栈溢出。这是踪迹。我认为这可能是一个常见问题,有更多黑客 clojure 经验的人可以为我指明正确的方向。

这是导致问题的一段代码。

(defn move-split [[xs ys]] (doall (concat (list (concat xs (list (first ys))))  (list (next ys)))))

由于stackoverflow,我把doall放在那里,但这仍然没有解决问题。
(defn move-split [[xs ys]] (doall (concat (list (doall (concat xs (list (first ys))))  ) (doall (list (next ys)))   )))

注意到额外的娃娃了吗?在这里,无论我在哪里调用 concat,我都会通过 doall 过滤结果。 Stackoverflow 不见了。

doall 似乎不是递归的。即不评估也是 concat 结果的嵌套列表。你怎么认为?
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at jline.ConsoleRunner.main(Unknown Source)
Caused by: java.lang.StackOverflowError (bubble_sort2.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:5440)
at clojure.lang.Compiler.load(Compiler.java:5857)
at clojure.lang.Compiler.loadFile(Compiler.java:5820)
at clojure.main$load_script.invoke(main.clj:221)
at clojure.main$script_opt.invoke(main.clj:273)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at clojure.lang.Var.invoke(Var.java:365)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
... 5 more
Caused by: java.lang.StackOverflowError
at clojure.core$seq.invoke(core.clj:122)
at clojure.core$concat$fn__3450.invoke(core.clj:599)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:450)
at clojure.core$seq.invoke(core.clj:122)
at clojure.core$concat$fn__3450.invoke(core.clj:599)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:450)
at clojure.core$seq.invoke(core.clj:122)
at clojure.core$concat$fn__3450.invoke(core.clj:599)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:450)
at clojure.core$seq.invoke(core.clj:122)
at clojure.core$concat$fn__3450.invoke(core.clj:599)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:450)
at clojure.core$seq.invoke(core.clj:122)
at clojure.core$concat$fn__3450.invoke(core.clj:599)

最佳答案

你连续堆积了一堆懒惰的操作,构建了一个表达式

(concat (concat (concat ... [3]) [2]) [1])

或类似。为了确定结果列表中的第一个元素,编译器必须深入研究您提供的函数堆栈。尝试构建您的代码,以免发生这种情况,或者经常抛出(doall)以强制进行急切/严格计算。不过,我无法仅通过堆栈跟踪来深入了解更多细节 - 代码会有所帮助。

关于clojure - 为什么我得到一个stackoverflow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5294055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com