emacsの(require 'package)は何を意味し、load-fileとどう違うのですか?


10

数日前にemacsを使い始めた(require 'package-name)ところ、package-installを使用して上記のパッケージをインストールするときに不要な場所を読みました。しかし、なぜ、(require 'package-name)実際には何が行われload-fileload手順とはどのように異なるのでしょうか。


7
私たち全員がEmacsで最初に学ばなければならないことの1つは、M-x describe-functiondoc-stringを読むことです。別名doc-stringをC-h f入力M-x describe-function RET require RETして読み取ります。次にM-x describe-function RET load-file RET、doc-stringを入力して読み取ります。次にM-x describe-function RET load RET、doc-stringを入力して読み取ります。3つのdoc-stringsをすべて読んだ後、質問を編集して3つの関数をすべて比較対照し、それに関してまだ理解していないことを明確にしてください。変数についても同じ手順を使用します-つまりM-x describe-variable
2016年

回答:


13

あなたならばload、ライブラリを繰り返し、そのファイルが読み込まれ、そのコードが(、毎回あなたがそれを読み込む)を繰り返し評価しました。

requireライブラリを繰り返し使用する場合load、ライブラリは1回だけ使用されます(ライブラリが既にロードされている場合は、最大で-まったく使用されません)。

requirerequireライブラリの大部分のライブラリには(provide 'FEATURE)特定のFEATURE名前のコードが含まれているため、最初にライブラリをロードするために使用されなかった場合でも、この効率を提供します。そのコードは、ライブラリのロード時に、どのようにロードされたかに関係なく評価され、そのときにデータを更新して、require何かする必要があるかどうかを判断するときにチェックします。

require特定のライブラリがロードされていることを確認する必要がある場合は、ほとんどの場合、独自のコードで使用します。

ELPAパッケージでこれを頻繁に行う必要がない理由は、パッケージマネージャーがパッケージ内のオートロードCookieを自動的に処理し、そのパッケージのオートロードのファイルを生成するためです。Emacsの起動時にパッケージシステムが初期化されると、各パッケージのオートロードファイルが評価され、オートロードされたすべての関数が識別されます。自動ロードされた関数が呼び出されると、関数の実際の定義を含むライブラリが自動的にロードされます。

パッケージの作成者は、ユーザーが直接呼び出すことが期待される可能性のある各関数にオートロードCookieを追加できます。したがって、それらの期待が正しけれrequireば、パッケージを使用したり、明示的にロードしたりする必要はありません。

独自のカスタムオートロードを定義することもできます。独自の構成でライブラリのカスタム遅延読み込みと遅延構成を使用したい場合C-hig (elisp) Autoload RETも参照(elisp) Hooks for Loadingしてください。(後者は、「このライブラリがロードされるまでこのコードを評価しないでください」と言います。これは、「必要になるまでこのライブラリをロードしない」オートロードメカニズムとうまく結び付いています)。


2
すでにElispマニュアルを参照しているので、別の関連ノードはだと思います(elisp) Named Features
バジル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.