Next: Watching Variables, 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に記述された式は評価される。リターン値は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)