GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Setting-Variables.html ・ emacs-doc.conao3.com

12.8 変数の値の設定

変数の値を変更する一般的な方法は、特殊形式 setq を用いることです。実行時に変数の値を決定する必要がある場合は、関数 set を使用してください。

特殊形式: setq [symbol form]…

この特殊な形式は、変数の値を変更する最も一般的な方法です。各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 that x is set before
      y (1+ x))     ;   the value of y is computed.
     ⇒ 11
関数: set symbol value

この関数は、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 is one that was set.
     ⇒ 2
(let ((one 1))      ; This binding of one is 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)
マクロ: setopt [symbol form]…

これは 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 ファイルでユーザーオプションを設定することです。