変数の値を変更する一般的な方法は、特殊形式 setq
を用いることです。実行時に変数の値を決定する必要がある場合は、関数 set を使用してください。
この特殊な形式は、変数の値を変更する最も一般的な方法です。各symbolには、対応するformを評価した結果である新しい値が代入されます。これにより、シンボルの現在の束縛が変更されます。
setq は symbol
を評価せず、記述したシンボルを設定します。この引数は自動的にクォートされると言います。setq 内の ‘q’ は
“クォート済み” を表します。
setq 形式の値は、直前の form
の値となります。
(setq x (1+ 2))
⇒ 3
x ; x now has a global value.
⇒ 3
(let ((x 5))
(setq x 6) ; The local binding of x is set.
x)
⇒ 6
x ; The global value is unchanged.
⇒ 3
なお、まず最初の form が評価され、次に最初の symbol が設定され、続いて2番目の form が評価され、次に2番目の symbol が設定される、という具合に続きます:
(setq x 10 ; Notice thatxis set before y (1+ x)) ; the value ofyis computed. ⇒ 11
この関数は、symbol の値セルに value を代入します。特殊形式ではなく関数であるため、symbol に書かれた式が評価され、設定するシンボルが得られます。戻り値は value です。
動的変数束縛が有効な場合(デフォルト)、set は setq と同じ効果を持ちますが、set は引数 symbol を評価するのに対し、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 evaluates to symbol one.
⇒ 2
one ; So it isonethat was set. ⇒ 2 (let ((one 1)) ; This binding ofoneis set, (set 'one 3) ; not the global value. one) ⇒ 3
one
⇒ 2
symbol が実際にはシンボルでない場合、wrong-type-argument エラーが報告されます。
(set '(x y) 'z) error→ Wrong type argument: symbolp, (x y)
これは setq(上記参照)と同様ですが、ユーザーオプション向けのものです。このマクロはカスタマイズ機構を利用して変数を設定します(カスタマイズ変数の定義を参照)。具体的には、setopt はその変数に関連付けられたセッター関数を実行します。例えば、次のような場合:
(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 はまた、値がユーザーオプションとして有効かどうかも判定します。例えば、number 型で定義されたユーザーオプションを文字列に設定するために setopt を使用すると、エラーが発生します。
Unlike defcustom and related customization
commands, such as customize-variable, setopt is meant for non-interactive use, in particular
in the user init file. For that reason, it doesn’t record the
standard, saved, and user-set values, and doesn’t mark the variable as
candidate for saving in the custom file.
setopt マクロは、通常の非ユーザーオプション変数に対しても使用できますが、setq に比べると効率が大幅に劣ります。このマクロの主な用途は、ユーザーの init
ファイルでユーザーオプションを設定することです。