Next: Accessing Variables, Previous: Defining Variables, Up: Variables [Contents][Index]
値が関数(または関数のリスト)であるような変数を定義するときには、変数の名前の最後に‘-function’(または‘-functions’)を使用します。
他にも変数名に関する慣習があります。以下はその完全なリストです:
変数はノーマルフック(Hooksを参照)。
値は関数。
値は関数のリスト。
値はフォーム(式)。
値はフォーム(式)のリスト。
値は述語(predicate) — 1つの引数をとる関数 — であり成功なら非nil
、失敗ならnil
をリターンする。
nil
か否かだけが意味をもつような値。結局そのような変数は、やがては多くの値をもつことが多いので、この慣習を強く推奨はしない。
値はプログラム名。
値は完全なシェルコマンド。
値はコマンドにたいして指定するオプション。
変数を定義するときは、その変数を安全(safe)とマークすべきか、それとも危険(risky)とマークすべきかを常に考慮してください。File Local Variablesを参照してください。
複雑な値を保持する変数(バインディングをもつkeymapなど)の定義や初期化を行う場合は、以下のように値の計算をすべてdefvar
の中に配置するのが最良です:
(defvar my-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-a" 'my-command) … map) docstring)
この方法にはいくつかの利点があります。1つ目はファールをロード中にユーザーが中断した場合、変数はまだ初期化されていないか、初期化されているかのどちらかであり、その中間ということはありません。まだ初期化されていなければ、ファイルをリロードすれば正しく初期化されます。2つ目は一度初期化された変数は、ファイルをリロードしても変更されないことです。コンテンツの一部を変更(たとえばキーのリバインド)するフックをユーザーが実行した場合などに、これは重要です。3つ目はC-M-xでdefvar
を評価すると、そのマップは完全に再初期化されることです。
defvar
フォーム内に多すぎるコードを配置することが不利な点が1つあります。ドキュメント文字列が変数の名前から離れた場所に配置されることです。これを避ける安全な方法は以下の方法です:
(defvar my-mode-map nil docstring) (unless my-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-a" 'my-command) … (setq my-mode-map map)))
これは初期化をdefvar
の内側に配置した場合とまったく同じ利点をもちますが、変数を再度初期化したい場合は、各フォームにたいして1回ずつ、C-M-xを2回タイプしなければならない点が異なります。