Next: Variable Scoping, Previous: Accessing Variables, Up: Variables [Contents][Index]
ある変数の値を変更する通常の方法は、スペシャルフォームsetq
を使用する方法です。実行時に変数選択を計算する必要がある場合は、関数set
を使用します。
このスペシャルフォームは、変数の値を変更するための、もっとも一般的な方法です。symbolにはそれぞれ、新しい値(対応するformが評価された結果)を与えられます。そのシンボルのカレントバインディングは変更されます。
setq
はsymbolを評価せず、記述されたシンボルをセットします。この引数のことを、自動的にクォートされた(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
この関数は、symbolの値セルにvalueを配置します。これはスペシャルフォームではなく関数なので、シンボルにセットするために、symbolに記述された式は評価されます。return値はvalueです。
ダイナミックな変数バインドが有効な場合(デフォルト)、set
は自身の引数symbolを評価しますが、setq
は評価しないという点を除き、set
はsetq
と同じ効果をもちます。しかし、変数がレキシカルバインドの場合、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)