Emacs:嵌套超过`max-lisp-eval-depth'

时间:2012-08-04 08:30:08

标签: emacs

我不时会收到“嵌套超过`max-lisp-eval-depth'”的错误。

  • 这是什么意思?
  • 当我拿到一个时,除了“killall emacs”之外,我能做些什么吗?

编辑:

如果您评估,可以收到错误:

(defun func ()
  (func))
(func)

但是,在这种情况下,emacs仍然保持响应。

3 个答案:

答案 0 :(得分:8)

立即补救措施可以是简单地增加最大值。它的默认值是500,但您可以将它设置为10000,如下所示:

(setq max-lisp-eval-depth 10000)

但这通常不是一个好主意,因为你遇到嵌套的事实首先超过了'max-lisp-eval-depth'错误,这表明你的某些部分代码占用了太多的堆栈空间。但至少暂时增加最大值可以帮助您分析问题,而不会一遍又一遍地收到相同的错误消息。

答案 1 :(得分:4)

基本上,这意味着一些Lisp代码使用的堆栈比Emacs编译得允许更多。

实际上,它是Lisp代码中的一个错误的标志。正确编写的代码应该避免深深嵌套,即使算法和输入数据是“正确的”;但更常见的是,它是由于未处理的角落情况或意外输入而发生的。

如果你很幸运,重复的控制-G按键可以让你摆脱难题,而不会杀死Emacs。

如果您正在开发Emacs Lisp代码,您可能需要巧妙地调整max-lisp-eval-depth的值,以帮助找到代码可能需要强化或修复错误的位置。当然,将debug-on-error设置为t应该会向您展示堆栈的回溯。

答案 2 :(得分:0)

Emacs有一个Lisp评估员。此求值程序解释lisp函数。调用函数时,求值程序会在堆栈上添加一个帧,以便记住最后一个状态。为了限制lisp解释器的内存使用,可以将其配置为不要进行超过max-lisp-eval-depth次调用。这里depth是评估堆栈的深度。