Elisp中的变量绑定

3
Elisp程序
(defun test (ee) (symbol-value ee))
(setq e 1.1)
(test 'e)

它的结果是1.1。

然后将“test”中的“ee”更改为“e”,

(defun test (e) (symbol-value e))
(setq e 1.1)
(test 'e)

它的结果是e

为什么会有不同的结果?


1
作为一个要点,确保你的变量名不太可能与其他库发生冲突(通常通过为库中所有符号使用公共前缀来实现),或者与同一库中的其他变量发生冲突(除非你确定自己在做什么,否则不要重复上面示例中的名称)。 - phils
1个回答

4
正式参数e绑定到符号e,作为参数传递。当关闭词法绑定时,评估(symbol-value e)时,形式参数e的值是返回的符号e。也就是说,在传递参数的符号和函数绑定变量之间存在混淆(变量捕获)。
如果您使用不同的符号(例如ee)作为参数,则不会存在变量捕获。这是动态绑定容易混淆的一个典型例子。

当将变量lexical-binding设置为t时,第二个结果为1.1,但是当将变量lexical-binding设置为nil时,第一个结果不会改变。 - Redefl
如果您传递的参数变量(符号)与函数绑定的变量相同,则会发生变量捕获。参数的值是符号e(或ee),并且在动态环境中查找参数esymbol-value,其中其symbol-value是符号e - Drew
如果将lexical-binding设置为t,那么就不存在变量捕获。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接