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

12.6 変数を堅牢に定義するためのヒント

値として関数または関数のリストを持つ変数を定義する際は、それぞれ ‘-function’ または ‘-functions’ で終わる名前を使用してください。

他にもいくつかの変数名の命名規則があります。以下にその一覧を示します。

‘…-hook’

この変数は通常のフックです(フックを参照)。

‘…-function’

値は関数です。

‘…-functions’

値は関数のリストです。

‘…-form’

値はフォーム(式)です。

‘…-forms’

値はフォーム(式)のリストです。

‘…-predicate’

値は述語—単一の引数をとり、成功時には non-nil を、失敗時には nil を返す関数です。

‘…-flag’

その値は、nil であるか否かという点においてのみ意味を持ちます。こうした変数は時間の経過とともにより多くの値を持つようになることが多いため、この慣習はあまり推奨されません。

‘…-program’

値はプログラム名です。

‘…-command’

値はシェルコマンド全体です。

‘…-switches’

値にはコマンドのオプションを指定します。

‘prefix--…’

この変数は内部利用を目的としており、ファイル prefix.el で定義されています。 (2018年以前に提供されたEmacsコードでは、別の規約に従っている場合がありますが、現在は段階的に廃止されつつあります。)

‘…-internal’

この変数は内部利用を目的としており、Cコードで定義されています。(2018年以前に提供されたEmacsコードでは異なる規約が採用されている場合がありますが、現在は段階的に廃止されつつあります。)

変数を定義する際は、常にそれを「安全」か「危険」のどちらとしてマークすべきか検討してください。ファイルローカル変数を参照してください。

複雑な値(メジャーモードの構文テーブルなど)を保持する変数を定義・初期化する際は、次のように値の計算処理全体をdefvarに記述するのが最善です。

(defvar my-major-mode-syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?# "<" table)
    ...
    table)
  docstring)

この手法にはいくつかの利点があります。第一に、ファイルの読み込み中にユーザーが終了した場合、変数は未初期化のままか、あるいは適切に初期化された状態のいずれかとなり、その中間の状態になることはありません。未初期化のままであれば、ファイルを再読み込みすることで適切に初期化されます。第二に、変数が初期化された後にファイルを再読み込みしても、その値は変更されません。これは、ユーザーが値を変更していた場合に重要となります。第三に、defvar 形式を C-M-x で評価すると、変数が完全に再初期化されます。