この関数は、symbolを定義したファイル名を返します。typeがnilである場合、いかなる種類の定義でも許容されます。typeがdefun、defvar、またはdeffaceである場合は、関数定義、変数定義、またはフェイス定義のみを指定します。
値は通常、絶対ファイル名となります。また、定義がいずれのファイルにも関連付けられていない場合は、nilとなることもあります。symbolで自動ロードされる関数が指定されている場合、値は拡張子を除いた相対ファイル名となります。
オプションの第3引数 native-p が nil
ではなく、かつ Emacs がネイティブコンパイル対応でビルドされている場合(Lisp のネイティブコードへのコンパイル を参照)、この関数は .elc や .el ファイルではなく、symbol を定義した .eln
ファイルを探そうとします。そのような .eln
ファイルが見つかり、かつ古くない場合、関数はその絶対ファイル名を返します。そうでない場合は、ソースファイルまたはバイトコンパイル済みファイルのいずれかの名前を報告します。
symbol-fileの根拠は、変数load-historyのデータです。
この変数の値は、ロード済みライブラリファイルの名前と、そこで定義された関数や変数の名前、およびそれらが提供または要求した機能とを対応付けたalistです。
このalistの各要素は、ロード済みのライブラリ1つ(起動時にプリロードされたライブラリを含む)を表します。これは、CARがライブラリの絶対ファイル名(文字列)であるリストです。リストの残りの要素は、以下の形式となっています。
var記号 var が変数として定義された。
(defun . fun)関数 fun が定義された。fun
を関数として定義することを表す (defun . fun)。
(defface . face)顔 face が定義された。
(require . feature)属性 feature が必要でした。
(provide . feature)機能 feature が提供されました。
(cl-defmethod method specializers)名前付きの method は、cl-defmethod
を用い、specializers を特殊化子として定義されました。
(define-type . type)型 type が定義されました。
load-history の値には、CAR が
nil である要素が1つ含まれる場合があります。この要素は、ファイルを参照していないバッファ上で
eval-buffer を用いて行われた定義を記述します。
コマンド eval-region は load-history
を更新しますが、その際、訪問中のファイルに対して要素に定義されたシンボルを追加するのであって、その要素を置き換えるわけではありません。Eval を参照してください。
load-history に加えて、すべての関数はシンボルプロパティ function-history
で自身の履歴を保持しています。この点において関数が特別に扱われる理由は、関数が2つの異なるファイルで2段階に分けて定義されることが一般的であるためです(通常、そのうちの1つはオートロードされます)。そのため、ファイルを適切に
アンロード
するには、そのファイルが関数定義に対してどのような処理を行ったかをより正確に把握する必要があります。
シンボルプロパティ function-history は (file1 def2 file2 def3 ...) 形式のリストを保持しており、ここで file1 は定義を変更した最後のファイル、def2 は file1 より前の定義(file2
によって設定されたものなど)を表します。論理的には、このリストはこの関数を定義した最初のファイルの名前で終わるべきですが、容量を節約するため、通常はこの最後の要素が省略されます。