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


11.8 Setting Variable Values

ある変数の値を変更する通常の方法は、スペシャルフォームsetqを使用する方法です。実行時に変数選択を計算する必要がある場合は、関数setを使用します。

Special Form: setq [symbol form]…

このスペシャルフォームは、変数の値を変更するための、もっとも一般的な方法です。symbolにはそれぞれ、新しい値(対応するformが評価された結果)を与えられます。そのシンボルのカレントバインディングは変更されます。

setqsymbolを評価せず、記述されたシンボルをセットします。この引数のことを、自動的にクォートされた(automatically quoted)と呼びます。setqの‘q’は、“quoted(クォートされた)”が由来です。

setqフォームの値は、最後のformの値となります。

(setq x (1+ 2))
     ⇒ 3
x                   ; ここでxはグローバル値をもつ。
     ⇒ 3
(let ((x 5))
  (setq x 6)        ; xのローカルバインディングをセット。
  x)
     ⇒ 6
x                   ; グローバル値は変更されない。
     ⇒ 3

1番目のformが評価されてから1番目のsymbolがセットされ、次に2番目のformが評価されてからsymbolが評価されて、...となることに注意してください:

(setq x 10          ; ここで、xがセットされるのは
      y (1+ x))     ;   yの計算前であることに注目。
     ⇒ 11
Function: set symbol value

この関数は、symbolの値セルにvalueを配置します。これはスペシャルフォームではなく関数なので、シンボルにセットするために、symbolに記述された式は評価されます。return値はvalueです。

ダイナミックな変数バインドが有効な場合(デフォルト)、setは自身の引数symbolを評価しますが、setqは評価しないという点を除き、setsetqと同じ効果をもちます。しかし、変数がレキシカルバインドの場合、setは変数のダイナミックな値に影響し、setqは変数のカレント値(レキシカル値)に影響します。Variable Scopingを参照してください。

(set one 1)
error→ Symbol's value as variable is void: one
(set 'one 1)
     ⇒ 1
(set 'two 'one)
     ⇒ one
(set two 2)         ; twoは、シンボルoneに評価される。
     ⇒ 2
one                 ; したがってoneがセットされる。
     ⇒ 2
(let ((one 1))      ; oneのこのバインディングがセットされるのであって
  (set 'one 3)      ;   グローバル値はセットされない。
  one)
     ⇒ 3
one
     ⇒ 2

symbolが実際のシンボルでない場合、wrong-type-argumentエラーがシグナルされます。

(set '(x y) 'z)
error→ Wrong type argument: symbolp, (x y)