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


11.4 変数が“void”のとき

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

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

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

Function: makunbound symbol

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

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