12.4 变量为空的情况

如果一个符号的值单元(value cell)未被赋值,我们就称这个变量是空(void)的(see 符号的组成)。

在 Emacs Lisp 默认的动态作用域规则下(see Scoping 变量绑定的作用域规则),值单元存放的是变量当前的值(局部值或全局值)。注意:值单元未被赋值, 不等于 值单元里是 nil。符号 nil 本身是一个 Lisp 对象,它可以像其他对象一样成为变量的值,它仍然是一个有效值。 如果一个变量为空,那么对它进行求值时会触发 void-variable 错误,而不是返回某个值。

在可选的词法作用域规则下,值单元仅保存变量的全局值 — 即所有词法绑定结构之外的值。当变量被词法绑定时,其局部值由词法环境决定;因此,即使符号的值单元未被赋值,变量也可以拥有局部值。

Function: makunbound symbol

该函数会清空 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
Function: boundp variable

如果变量 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

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike