Next: , Previous: Local Variables, Up: Variables


10.4 変数が『空』であるとき

シンボルにグローバル変数としての値を一度も与えていないとき、 そのシンボルのグローバル値は(void)であるといいます。 いいかえれば、シンボルの値セルにはどんなLispオブジェクトも入っていません。 シンボルを評価しようとすると、値ではなくエラーvoid-variableを得ます。

nilという値は空とは異なることに注意してください。 シンボルnilはLispオブジェクトであり、他のオブジェクトと同様に 変数の値になりえます。 それはなのです。 空な変数はいかなる値も持たないのです。

変数に値を与えたあとでは、makunboundを使って 再度その変数を空にできます。

— Function: makunbound symbol

この関数は、symbolの現在の変数束縛を空にする。 これ以降に変数としてこのシンボルの値を使おうとすると、 再度設定していない限り、エラーvoid-variableを通知する。

makunboundsymbolを返す。

          
          (makunbound 'x)      ; 変数xのグローバル値を空にする
                x
          x
          error--> Symbol's value as variable is void: x

symbolがローカルに束縛されていると、 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を使って調べられます。

— Function: boundp variable

boundpは、(シンボル)variableが空でなければ、 より正確にいえば、現在の束縛が空でなければtを返す。 さもなければnilを返す。

          
          (boundp 'abracadabra)          ; 空で始める
                nil
          
          (let ((abracadabra 5))         ; ローカルに束縛する
            (boundp 'abracadabra))
                t
          
          (boundp 'abracadabra)          ; グローバルにはまだ空である
                nil
          
          (setq abracadabra 5)           ; グローバルに空でなくする
                5
          (boundp 'abracadabra)
                t