シンボルの値セル(シンボルの構成要素を参照)に値が割り当てられていない場合、その変数はvoid(空)であると言います。
Emacs Lispのデフォルトであるダイナミックスコープルール(変数のバインディングのスコーピングルールを参照)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnil
をもつのとは異なることに注意してください。シンボルnil
はLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nil
は値なのです。変数がvoidの場合にその変数の評価を試みると、値をリターンするかわりに、void-variable
エラーがシグナルされます。
オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのはその変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがってこれらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。
この関数はsymbolの値セルを空にして、その変数をvoidにする。この関数はsymbolをリターンする。
symbolがダイナミックなローカルバインディングをもつなら、makunbound
はカレントのバインディングをvoidにして、そのローカルバインディングが効果を持つ限りvoidにする。その後で以前にシャドーされたローカル値(またはグローバル値)が再び有効になって、再び有効になった値がvoidでなければ、その変数はvoidではなくなる。
いくつか例を示す(ダイナミックバインディングが有効だとする):
(setq x 1) ; グローバルバインディングに値をセットする ⇒ 1 (let ((x 2)) ; それをローカルにバインドする (makunbound 'x) ; ローカルバインディングをvoidにする x) error→ Symbol's value as variable is void: x
x ; グローバルバインディングは変更されない ⇒ 1 (let ((x 2)) ; ローカルにバインドする (let ((x 3)) ; もう一度 (makunbound 'x) ; 最内のローカルバインディングをvoidにする x)) ; それを参照すると、void error→ Symbol's value as variable is void: x
(let ((x 2))
(let ((x 3))
(makunbound 'x)) ; 内側のバインディングをvoidにしてから取り除く
x) ; 外側のlet
バインディングが有効になる
⇒ 2
この関数はvariable(シンボル)がvoidでなければt
、voidならnil
をリターンする。
いくつか例を示す(ダイナミックバインディングが有効だとする):
(boundp 'abracadabra) ; 最初はvoid
⇒ nil
(let ((abracadabra 5)) ; ローカルにバインドする
(boundp 'abracadabra))
⇒ t
(boundp 'abracadabra) ; グローバルではまだvoid
⇒ nil
(setq abracadabra 5) ; グローバルで非voidにする
⇒ 5
(boundp 'abracadabra) ⇒ t