lisp - 预定义全局变量的词法绑定
问题描述
这是让我感到困惑的片段:
(setq lexical-binding t)
(defvar x 0)
(setq test (let ((x 1))
(lambda ()
x)))
(funcall test)
我的理解是,既然lexical-binding
是真的,那么值 1 的 x 应该涵盖 的范围let
,这应该包括x
在 的定义中lambda
,因此,测试应该返回值 1 而不是 0,但结果是返回 0 ,这是x
by的值defvar
。
我是不是误会了什么?
更新
只是为了澄清,我想在这里表达我的理解。动态边界意味着它只有一个符号,并且值在堆栈中弹出和弹出。这样,当 的定义lambda
完成后,let 中使用的值就会被弹出。词法/静态边界是指始终在词法环境的上下文中检查该值,因此只要在定义let
之前存在,就使用 in 的值。定义的变量总是动态绑定的,因此,这里的词法绑定控制没有任何区别。lambda
let
defvar
解决方案
根据https://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Lexical-Binding.html,即使lexical-binding
是 non- nil
,特殊变量(比如x
因为它是用 定义的defvar
)仍然是动态绑定的.
推荐阅读
- intellij-idea - 尝试使用 TeamCity 和 Intellij 构建工件
- python - jsonpath_rw for Python - 解析特定键
- react-native - React Native 在发布模式下崩溃
- python-3.x - 在 Python 3 中显示多位索引作为 matplotlib.pyplot.annotate 的参数
- angular - ngForm 与 Angular 6 中的验证和子组件
- javascript - 如何使用 js 库 bowser?
- python - 如何在多处理中结合 TimeoutError 和 tqdm 进度条?
- clearcase - 如何在命令行的所有临时视图中取消签出文件?
- r - 如何根据来自超过 2 个其他数据帧的条件填充数据帧的空列,所有这些数据帧的长度都不同?
- c# - 使用 http 触发函数将输入绑定到表存储