今天阅读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))))
应该是这个项目编写的有问题:
感谢你的答案。