如果一个符号的值单元(value cell)未被赋值,我们就称这个变量是空(void)的(see 符号的组成)。
在 Emacs Lisp 默认的动态作用域规则下(see Scoping 变量绑定的作用域规则),值单元存放的是变量当前的值(局部值或全局值)。注意:值单元未被赋值, 不等于 值单元里是 nil。符号 nil 本身是一个 Lisp 对象,它可以像其他对象一样成为变量的值,它仍然是一个有效值。
如果一个变量为空,那么对它进行求值时会触发 void-variable 错误,而不是返回某个值。
在可选的词法作用域规则下,值单元仅保存变量的全局值 — 即所有词法绑定结构之外的值。当变量被词法绑定时,其局部值由词法环境决定;因此,即使符号的值单元未被赋值,变量也可以拥有局部值。
该函数会清空 symbol 的值单元(value cell),使对应的变量变为空(void)状态。函数的返回值是 symbol。
若 symbol 存在动态局部绑定,makunbound 会将当前绑定置为空;且这种空状态仅在该局部绑定生效期间有效。当该局部绑定失效后,之前被遮蔽的局部绑定或全局绑定会重新生效;此时变量将不再为空,除非重新生效的绑定本身也是空的。
以下是一些示例(假设动态绑定规则已生效):
(setq x 1) ; Put a value in the global binding. ⇒ 1 (let ((x 2)) ; Locally bind it. (makunbound 'x) ; Void the local binding. x) error→ Symbol's value as variable is void: x
x ; The global binding is unchanged. ⇒ 1 (let ((x 2)) ; Locally bind it. (let ((x 3)) ; And again. (makunbound 'x) ; Void the innermost-local binding. x)) ; And refer: it’s void. error→ Symbol's value as variable is void: x
(let ((x 2))
(let ((x 3))
(makunbound 'x)) ; Void inner binding, then remove it.
x) ; Now outer let binding is visible.
⇒ 2
如果变量 variable(一个符号)不是空(void)的,该函数返回 t;如果变量为空,则返回 nil。
以下是一些示例(假设当前使用动态绑定):
(boundp 'abracadabra) ; Starts out void.
⇒ nil
(let ((abracadabra 5)) ; Locally bind it.
(boundp 'abracadabra))
⇒ t
(boundp 'abracadabra) ; Still globally void.
⇒ nil
(setq abracadabra 5) ; Make it globally nonvoid.
⇒ 5
(boundp 'abracadabra)
⇒ t