常见的lisp实现在运行时修改堆栈大小

时间:2013-08-10 21:44:09

标签: common-lisp

是否有任何常见的lisp实现允许在运行时修改堆栈大小?堆的大小怎么样?

我正在使用sbcl,显然这些是在可执行文件启动时定义的,之后不能更改。

1 个答案:

答案 0 :(得分:4)

例如,ECL和LispWorks可以在运行时扩展堆栈。可以看到,当堆栈溢出时,两者都提供重启,以便在必要时增加堆栈大小:

<强> ECL

>  (defun s (n)
     (if (zerop n) 0 (+ 1 (s (1- n)))))

S

> (s 100000)

Condition of type: STACK-OVERFLOW
C-STACK overflow at size 4259840. Stack can probably be resized.

Available restarts:

1. (CONTINUE) Extend stack size
2. (RESTART-TOPLEVEL) Go back to Top-Level REPL.

Broken at S. In: #<process TOP-LEVEL>.
>> 

请参阅:http://ecls.sourceforge.net/new-manual/re86.html

上的ECL内存管理文档

<强> LispWorks

CL-USER 31 > (s 1000)

Stack overflow (stack size 15997).
  1 (continue) Extend stack by 50%.
  2 Extend stack by 300%.
  3 (abort) Return to level 0.
  4 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

LispWorks中的变量允许自定义:SYSTEM:*STACK-OVERFLOW-BEHAVIOUR*。请参阅http://www.lispworks.com/documentation/lw61/LW/html/lw-1440.htm#marker-887330

通过从操作系统请求更多内存,在大多数实现中自动增长。接下来的问题是:堆可以缩小吗?