13

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

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

编辑:

如果您评估以下内容,您可能会收到错误:

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

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

4

2 回答 2

13

一个直接的补救措施可以是简单地增加最大值。它的默认值为 500,但您可以像这样将其设置为 10000:

(setq max-lisp-eval-depth 10000)

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

于 2012-08-06T02:05:13.753 回答
4

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

实际上,这是 Lisp 代码中存在错误的标志。即使算法和输入数据是“正确的”,正确编写的代码也应避免深度嵌套;但更常见的是,由于未处理的极端情况或意外输入而发生这种情况。

如果你幸运的话,重复的 control-G 按键可以让你在不杀死 Emacs 的情况下摆脱困境。

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

于 2012-08-04T09:17:24.660 回答