嵌套 (funcall func) 超过 max-lisp-eval-depth,为什么?

Nested (funcall func) exceeds max-lisp-eval-depth, why?

我正在研究两个在 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,为什么(没有递归)?

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

另见 How to live with Emacs Lisp dynamic scoping?