【发布时间】:2013-10-12 18:35:43
【问题描述】:
当我运行以下代码时:
(defun countdown (n)
(if (>= n 0)
(cons n (countdown (- n 1)))))
(countdown 100000)
我收到以下消息:
INFO: Control stack guard page unprotected
Control stack guard page temporarily disabled: proceed with caution
debugger invoked on a SB-KERNEL::CONTROL-STACK-EXHAUSTED in thread
#<THREAD "main thread" RUNNING {1002B03653}>:
Control stack exhausted (no more space for function call frames).
This is probably due to heavily nested or infinitely recursive function
calls, or a tail call that SBCL cannot or has not optimized away.
PROCEED WITH CAUTION.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR)
如何增加堆栈空间?我不想更改上面的代码;我提供它纯粹是为了说明堆栈耗尽。
【问题讨论】:
-
人们可能会质疑堆栈运行深度为 100K 的程序的设计。
-
@PaulNathan One 确实可能。这是出于基准测试的目的,而不是用于真正的程序。不幸的是,这个小空白中没有足够的空间来概述它......
-
@PaulNathan :如果您有兴趣,它与此处的气泡排序讨论有关:groups.google.com/d/msg/qilang/cUE5fj7XfjE/ueo3MkB7h30J
-
似乎是合理的。 :-)
标签: common-lisp sbcl