Next: Defining Variables, Previous: Local Variables, Up: Variables [Contents][Index]
シンボルの値セル(Symbol Componentsを参照してください)に値が割り当てられていない場合、その変数はvoid(空)であると言います。
Emacs Lispのデフォルトであるダイナミックスコープルール(see Variable Scoping)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnil
をもつのとは異なることに注意してください。シンボルnil
はLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nil
は値なのです。変数がvoidの場合、その変数の評価を試みると、値をreturnするかわりに、void-variable
エラーがシグナルされます。
オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのは、その変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがって、これらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。
この関数は、symbolの値セルを空にして、その変数をvoidにします。この関数はsymbolをreturnします。
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)) ; もう1度。 (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
をreturnし、voidのときはnil
をreturnします。
いくつか例を示します(ダイナミックバインディングが有効だとします):
(boundp 'abracadabra) ; 最初はvoid。
⇒ nil
(let ((abracadabra 5)) ; ローカルにバインドする。
(boundp 'abracadabra))
⇒ t
(boundp 'abracadabra) ; グローバルではまだvoid。
⇒ nil
(setq abracadabra 5) ; グローバルで非voidにする。
⇒ 5
(boundp 'abracadabra) ⇒ t