Emacs:嵌套超过"最大 lisp-eval-depth"



我不时收到"嵌套超过`max-lisp eval depth'"错误。

  • 这是什么意思
  • 当我得到一个时,除了"致命的消瘦",我还能做些什么吗

编辑:

如果你评估,你可以得到错误

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

然而,在这种情况下,emacs仍然具有响应能力。

立即的补救措施可以是简单地增加最大值。它的默认值是500,但你可以像这样将它设置为10000:

(setq max-lisp-eval-depth 10000)

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

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

在实践中,这是Lisp代码中存在错误的标志。正确编写的代码应该避免嵌套太深,即使算法和输入数据是"嵌套";"正确";;但更常见的情况是,这种情况是由于未处理的拐角情况或意外输入而发生的。

换句话说,您可能已经通过递归创建了一个无休止的循环,或者例如,一个具有指数回溯的正则表达式。

如果你幸运的话,反复按下control-G键可以让你在不杀死Emacs的情况下摆脱这个难题。

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

最新更新