【问题标题】:common lisp implementation modify stack size at run-timecommon lisp 实现在运行时修改堆栈大小
【发布时间】:2013-08-10 21:44:08
【问题描述】:

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

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

【问题讨论】:

  • 你打算用这个完成什么?您动态地摆弄堆栈的事实有点奇怪

标签: common-lisp


【解决方案1】:

例如 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>.
>> 

请参阅 ECL 内存管理文档:http://ecls.sourceforge.net/new-manual/re86.html

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

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

【讨论】:

  • ccl呢?出于好奇,在 sbcl 中实现可动态调整大小的堆栈会很困难吗?
  • @stackman:在 CCL 中,如果您启动一个新线程,您可以设置线程的堆栈大小。在 SBCL 中实施有多难?我不知道。您必须询问实施者。
猜你喜欢
  • 1970-01-01
  • 2021-10-11
  • 2023-03-23
  • 2016-04-05
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2015-12-22
  • 2017-06-08
相关资源
最近更新 更多