変数のシンボルに未割り当ての値セルがある場合、その変数は void であると言います(シンボルの構成要素を参照)。
Emacs Lispのデフォルトの動的スコープ規則(変数束縛のスコープ規則を参照)では、値セルに変数の現在の(ローカルまたはグローバル)値が格納されます。なお、値が未割り当ての状態であることは、値セルにnilが入っていることとは異なります。シンボルnilはLispオブジェクトであり、他のあらゆるオブジェクトと同様に変数の値となり得ますが、それでもあくまで値であることに変わりはありません。変数がvoidである場合、その変数を評価しようとすると、値を返す代わりにvoid-variableエラーが発生します。
オプションの字句スコープ規則では、値セルには変数のグローバル値――すなわち、いかなる字句束縛構文の外側にある値――のみが格納される。変数が字句的に束縛されている場合、ローカル値は字句環境によって決定される。したがって、変数のシンボルの値セルが未代入であっても、その変数はローカル値を持ち得る。
この関数は値セルをsymbolで空にし、変数をvoidにします。symbolを返します。
変数エイリアス(変数エイリアスを参照)に適用すると、まず変数をそのエイリアスから切り離し、それによって
defvaralias の効果を打ち消します。
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 を、void の場合は 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