Next: Variable Scoping, Previous: Accessing Variables, Up: Variables
変数の値を変更する普通の方法は、スペシャルフォームsetq
を使うことです。
実行時に選択する変数を計算する必要があるときには、
関数set
を使います。
このスペシャルフォームは、変数の値を変更するもっとも一般的な方法である。 各symbolに、対応するformの評価結果である新たな値を与える。 シンボルの既存の際、ローカルの束縛を変更する。
setq
はsymbolを評価しない。 読者が書いたシンボルに設定する。 この変数は自動的にクォートされるのである。setq
の‘q’は、『quoted(クォートする)』を表す。フォーム
setq
の値は、最後のformの値である。(setq x (1+ 2)) 3 x ;x
はグローバル値を持つ 3 (let ((x 5)) (setq x 6) ;x
のローカル束縛を設定する x) 6 x ; グローバル値は変更されない 3最初のformを評価して最初のsymbolに設定し、 つぎに、2番目のformを評価して2番目のsymbolに設定し、 といった具合になることに注意。
(setq x 10 ;x
は、y
の値を計算するまえに y (1+ x)) ; 設定されることに注意 11
この関数は、symbolの値としてvalueを設定し、valueを返す。
set
は関数なので、symbolとして書いた式は、 設定するシンボルを得るために評価される。変数の既存の最ローカルの束縛に設定する。 隠されている束縛には影響しない。
(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 2symbol(の評価結果)が実際にはシンボルでないと、 エラー
wrong-type-argument
を通知する。(set '(x y) 'z) error--> Wrong type argument: symbolp, (x y)論理的には、
set
はsetq
よりもさらに基本的な操作である。 どんなsetq
の使い方でも、set
で素直に書き直せる。setq
は、set
を使ってマクロとして定義することも可能である。 しかし、set
そのものを使うことは稀であり、 初心者はset
を知る必要がほとんどない。 設定する変数を実行時に選ぶときにのみ有用である。 たとえば、コマンドset-variable
は、 ユーザーから変数名を読み取りその変数に設定するので、set
を使う必要がある。Common Lispに関した注意: Common Lispでは、set
はつねにシンボルの『スペシャル』な、つまり、 動的な値を変更し、文脈上の束縛を無視する。 Emacs Lispでは、すべての変数とすべての束縛は動的であり、set
はつねに既存の最ローカルの束縛に作用する。
変数に設定する別の関数は、リストに既存でない要素を追加するように 設計されたものです。
この関数は、elementが変数symbolの値のリストのメンバでなければ、 elementと変数symbolの値をコンスした値を 変数symbolに設定する。 リストを変更してもしなくても結果のリストを返す。 呼び出すまえに、symbolの値はリストであるほうがよい。
引数symbolは暗黙にクォートされない。
add-to-list
は、set
のように普通の関数であり、setq
とは違う。 必要ならば、読者自身でクォートする。
add-to-list
の使い方を以下に示します。
(setq foo '(a b)) (a b) (add-to-list 'foo 'c) ;;c
を追加する (c a b) (add-to-list 'foo 'b) ;; なんの効果もない (c a b) foo ;;foo
は変更されている (c a b)
(add-to-list '
var value)
に等価な式はつぎのとおりです。
(or (member value var) (setq var (cons value var)))