【问题标题】:Nested (funcall func) exceeds max-lisp-eval-depth, why?嵌套(funcall func)超过了 max-lisp-eval-depth,为什么?
【发布时间】:2017-10-31 11:44:13
【问题描述】:

我正在研究用于在 elisp 中执行独立单元测试的两个通用函数。一个是关于做某事并重置我的包的所有自定义变量,另一个是关于在临时缓冲区中做某事并重置我的包的所有自定义变量。

功能(通用):

(defun package-test-test (func)
    ""
    (unwind-protect
        (funcall func)
      (reset-all-custom-package-variables)))

函数(临时缓冲区):

    (defun package-test-test-in-buffer (func)
        ""
        (package-test-test
            (lambda ()
                (with-temp-buffer (funcall func)))))

当我现在调用:(package-test-test-in-buffer (lambda () (insert "a"))) 时,它超过了max-lisp-eval-depth,为什么(没有递归)?

【问题讨论】:

  • 请在选项菜单中启用debug-on-error 并检查*Backtrace* 缓冲区。
  • 后面作为函数调用的时候好像不允许两个参数名相同。
  • 嗯,你是允许(因此是你的问题的症状),但发生package-test-test绑定了变量@987654328 @ 到一个本身 evals (funcall func) 的函数,然后它调用该函数。因此无限递归。

标签: elisp ert


【解决方案1】:

您的问题是 dynamic binding,它是 Emacs Lisp 中的默认值:您的函数中的 func 参数是 same 变量。 您需要重命名其中一个或使用lexical binding

另见How to live with Emacs Lisp dynamic scoping?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多