感觉判断是否开启lexical binding的方法写错了,求大家帮忙指正

今天阅读jabber.el代码,发现有个地方很疑惑,感觉是写错了,还请大家帮忙确认下:

(defmacro jabber-lexical-p ()
  "Return non-nil in buffers with lexical binding."
  '(let* ((ret t)
          (code (lambda ()
                  ret)))
     (let ((_ret nil))
       (funcall code))))

来源是:

可能是抄错了… 把 _ret 改成 ret 倒是可用。

(defmacro jabber-lexical-p ()
  "Return non-nil in buffers with lexical binding."
  '(let* ((ret t)
          (code (lambda ()
                  ret)))
     (let ((ret nil))
       (funcall code))))

原理就是词法作用域引用的符号是创建时就确定的符号,动态作用域与求值环境有关。

当然,有更简单判断求值环境的代码:

(defun lexp () lexical-binding)

emacs 28 后 mode-line 也会显示当前是 dynamic 还是 lexical:

我也觉得是写错了,应该是

(defmacro jabber-lexical-p ()
  "Return non-nil in buffers with lexical binding."
  '(let* ((ret t)
          (code (lambda ()
                  ret)))
     (let ((ret nil))
       (funcall code))))

应该是这个项目编写的有问题:

感谢你的答案。

应该让人从标题看得出来你是在提问。

收到,确实写的题目不合适