Next: , Previous: , Up: ロード   [Contents][Index]


16.8 どのファイルで特定のシンボルが定義されているか

Function: symbol-file symbol &optional type native-p

この関数はsymbolを定義しているファイルの名前をリターンする。typenilなら、どのようなタイプの定義も受け入れる。typedefunなら関数定義、defvarは変数定義、deffaceはフェイス定義だけを指定する。

値は通常は絶対ファイル名である。定義がどのファイルにも関係しなければnilになることもある。symbolがオートロード関数を指定するなら、値が拡張子なしの相対ファイル名になることもある。

オプションの3番目の引数native-pが非nil、かつネイティブコンパイルのサポートつき(Lispからネイティブコードへのコンパイルを参照)でビルドされたEmacsの場合には、この関数は.elc.elといったファイルではなく、.elnファイルで定義されたsymbolを探そうと試みる。そのような.elnファイルが見つかり古くなっていなければ、この関数は絶対ファイル名をリターンする。それ以外の場合にはソースファイルかバイトコンパイル済みファイルのいずれかの名前をリターンする。

symbol-fileは変数load-historyの値にもとづく。

Variable: load-history

この変数の値はロードされたライブラリーファイルの名前を、それらが定義する関数と変数の名前、およびそれらがプロバイドまたはリクワイアするフィーチャに関連付けるalistである。

このalist内の各要素は、1つのロード済みライブラリー(スタートアップ時にプリロードされたライブラリーを含む)を記述する。要素はCARがライブラリーの絶対ファイル名(文字列)であるようなリストである。残りのリスト要素は以下の形式をもつ:

var

シンボルvarが変数として定義された。

(defun . fun)

関数funは定義済み。(defun . fun)funを関数として定義されていることを表す。

(defface . face)

フェイスfaceが定義された。

(require . feature)

フィーチャfeatureがリクワイアされた。

(provide . feature)

フィーチャfeatureがプロバイドされた。

(cl-defmethod method specializers)

cl-defmethodを使用してスペシャライザーspecializersとともにmethodという名前が定義された。

(define-type . type)

typeが定義された。

load-historyの値には、CARnilであるような要素が1つ含まれるかもしれない。この要素はファイルをvisitしていないバッファーでeval-bufferにより作成された定義を記述する。

コマンドeval-regionload-historyを更新しますが、要素を置き換えずに、visitされているファイルの要素にたいして定義されたシンボルを追加します。evalについてを参照してください。

load-historyに加えて、関数はそれぞれシンボルプロパティfunction-historyで自身のヒストリーを追跡します。この点において関数が特別扱いされる理由は、関数は2つの異なるファイルにおいて2段階で定義されることがよくある(典型的にはそのうちの一方がautoloadされる)ので、ファイルを正しいunloadを可能にするために、そのファイルが関数定義に何を行ったかをより正確に知る必要があるのです。

シンボルプロパティfunction-historyには(file1 def2 file2 def3 ...)という形式のリストが保持されています。ここでfile1は定義を最後に変更したファイル、def2file1の前にfile2によってセットされた定義、...となります。論理的にはこのリストの最後はその関数を最初に定義したファイルですが、容量削減のために通常は最後の要素は省略されます。