Next: , Previous: , Up: Variables   [Contents][Index]


11.4 When a Variable is “Void”

シンボルの値セル(Symbol Componentsを参照してください)に値が割り当てられていない場合、その変数はvoid(空)であると言います。

Emacs Lispのデフォルトであるダイナミックスコープルール(see Variable Scoping)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnilをもつのとは異なることに注意してください。シンボルnilはLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nilは値なのです。変数がvoidの場合、その変数の評価を試みると、値をreturnするかわりに、void-variableエラーがシグナルされます。

オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのは、その変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがって、これらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。

Function: makunbound symbol

この関数は、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
Function: boundp variable

この関数は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