ある変数の値を変更する通常の方法は、スペシャルフォーム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
は変数のカレント値(レキシカル値)に影響する。変数のバインディングのスコーピングルールを参照のこと。
(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)
これはsetq
(上記参照)と似ているがユーザーオプションを意図したマクロであり、変数(複数可)のセットにCustomizeの仕組みを使用している(カスタマイゼーション変数の定義を参照)。特にsetopt
はその変数に割り当てられたset用の関数を実行する。たとえば以下のような場合に:
(defcustom my-var 1 "My var." :type 'number :set (lambda (var val) (set-default var val) (message "We set %s to %s" var val)))
ここで次を実行するとmy-var
に‘2’がセットされるとともに、メッセージも発行されるだろう:
(setopt my-var 2)
ユーザーオプションにたいしてsetopt
は値が妥当かどうかのチェックも行う。たとえばsetopt
でnumber
タイプと定義されたユーザーオプションに文字列をセットするとエラーがシグナルされるだろう。
defcustom
やcustomize-variable
のようなCustomize関連コマンドとは異なり、setopt
は非インタラクティブな使用、特にユーザーのinitファイルでの使用を意図している。この理由により値がstandard、saved、user-setのいずれなのかは記録せず、customファイルへの保存用に変数をマークすることも行わない。
setopt
マクロはユーザーオプションではない通常の変数にも使用できるが、setq
に比べると効率において遥かに劣る。このマクロのユースケースは、主にinitファイル内でのユーザーオプションのセットである。