次: Defining Variables, 前: Local Variables, 上: Variables
シンボルにグローバル変数としての値を一度も与えていないとき、
そのシンボルのグローバル値は空(void)であるといいます。
いいかえれば、シンボルの値セルにはどんなLispオブジェクトも入っていません。
シンボルを評価しようとすると、値ではなくエラーvoid-variable
を得ます。
nil
という値は空とは異なることに注意してください。
シンボルnil
はLispオブジェクトであり、他のオブジェクトと同様に
変数の値になりえます。
それは値なのです。
空な変数はいかなる値も持たないのです。
変数に値を与えたあとでは、makunbound
を使って
再度その変数を空にできます。
この関数は、symbolの現在の変数束縛を空にする。 これ以降に変数としてこのシンボルの値を使おうとすると、 再度設定していない限り、エラー
void-variable
を通知する。
makunbound
はsymbolを返す。(makunbound 'x) ; 変数x
のグローバル値を空にする => x x error--> Symbol's value as variable is void: xsymbolがローカルに束縛されていると、
makunbound
は既存の最ローカル束縛に作用する。 ローカル束縛を作成するすべての構文は変数に値を与えるため、 これはシンボルのローカル束縛を空にする唯一の方法である。 この場面では、空の状態は、束縛が存在する限り存続する。 束縛を作成した構造から抜け出して束縛が削除されると、 通常どおりそれ以前のローカル束縛かグローバル束縛が有効になり、 その束縛が空でなければ変数は空ではない。(setq x 1) ; グローバル束縛に値を入れる => 1 (let ((x 2)) ; ローカルに束縛する (makunbound 'x) ; ローカル束縛を空にする x) error--> Symbol's value as variable is void: x x ; グローバル束縛は変更されていない => 1 (let ((x 2)) ; ローカルに束縛する (let ((x 3)) ; もう一度 (makunbound 'x) ; もっとも内側のローカル束縛を空にする x)) ; 参照するが、それは空 error--> Symbol's value as variable is void: x (let ((x 2)) (let ((x 3)) (makunbound 'x)) ; 内側の束縛を空にし、それを削除する x) ; 外側のlet
の束縛が見える => 2
makunbound
で空にした変数は、
一度も値を受け取ったことがなく、そのために空である変数と区別できません。
変数が現在、空であるかどうかは関数boundp
を使って調べられます。
boundp
は、(シンボル)variableが空でなければ、 より正確にいえば、現在の束縛が空でなければt
を返す。 さもなければnil
を返す。(boundp 'abracadabra) ; 空で始める => nil (let ((abracadabra 5)) ; ローカルに束縛する (boundp 'abracadabra)) => t (boundp 'abracadabra) ; グローバルにはまだ空である => nil (setq abracadabra 5) ; グローバルに空でなくする => 5 (boundp 'abracadabra) => t