【问题标题】:Emacs: nesting exceeds `max-lisp-eval-depth'Emacs:嵌套超过了“max-lisp-eval-depth”
【发布时间】:2012-08-04 08:30:07
【问题描述】:

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

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

编辑:

如果你评估,你会得到错误:

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

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

【问题讨论】:

    标签: emacs


    【解决方案1】:

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

    (setq max-lisp-eval-depth 10000)
    

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

    【讨论】:

      【解决方案2】:

      基本上,这意味着某些 Lisp 代码使用的堆栈超出了 Emacs 编译允许的范围。

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

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

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

      【讨论】:

      • 这就是我的想法,但我不明白为什么堆栈不会简单地“崩溃”,而不是让 emacs 无法使用
      • @sabof 如果您想得到答案,请搜索 emacs-devel 邮件列表。据我了解,这主要是祖传的东西。
      猜你喜欢
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多