Next: , Previous: , Up: 変数   [Contents][Index]


12.8 変数の値のセット

ある変数の値を変更する通常の方法は、スペシャルフォームsetqを使用する方法です。実行時に変数選択を計算する必要がある場合には関数setを使用します。

Special Form: setq [symbol form]…

このスペシャルフォームは、変数の値を変更するためのもっとも一般的な方法である。symbolにはそれぞれ、新しい値(対応するformが評価された結果)が与えられる。そのシンボルのカレントバインディングは変更される。

setqsymbolを評価せずに、記述されたシンボルをセットする。この引数のことを自動的にクォートされた(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
Function: set symbol value

この関数はsymbolの値セルにvalueを配置する。これはスペシャルフォームではなく関数なので、シンボルにセットするためにsymbolに記述された式は評価される。リターン値はvalue

ダイナミックな変数バインドが有効(デフォルト)なら、setは自身の引数symbolを評価するが、setqは評価しないという点を除き、setsetqと同じ効果をもつ。しかし変数がレキシカルバインドなら、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)
Macro: setopt [symbol form]…

これは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は値が妥当かどうかのチェックも行う。たとえばsetoptnumberタイプと定義されたユーザーオプションに文字列をセットするとエラーがシグナルされるだろう。

defcustomcustomize-variableのようなCustomize関連コマンドとは異なり、setoptは非インタラクティブな使用、特にユーザーのinitファイルでの使用を意図している。この理由により値がstandard、saved、user-setのいずれなのかは記録せず、customファイルへの保存用に変数をマークすることも行わない。

setoptマクロはユーザーオプションではない通常の変数にも使用できるが、setqに比べると効率において遥かに劣る。このマクロのユースケースは、主にinitファイル内でのユーザーオプションのセットである。