Spec-Zone.ru › Elisp

Как программы выполняют загрузку

В Emacs Lisp есть несколько интерфейсов для загрузки. Например, autoload создаёт объект-заглушку для функции, определённой в файле; при попытке вызвать функцию автозагрузки файл загружается, чтобы получить настоящее определение функции (см. Автозагрузка). require загружает файл, если он ещё не загружен (см. Возможности). В конечном счёте все эти средства вызывают функцию load, выполняющую эту работу.

Функция: load filename &optional missing-ok nomessage nosuffix must-suffix

Эта функция находит и открывает файл с кодом Lisp, вычисляет все содержащиеся в нём формы и закрывает файл.

Для поиска файла load сначала ищет файл с именем filename.elc, то есть файл с именем filename и добавленным расширением «.elc». Если такой файл существует и Emacs был собран с поддержкой нативной компиляции (см. Компиляция Lisp в машинный код), load пытается найти соответствующий файл «.eln» и, если находит его, загружает вместо filename.elc. В противном случае загружается filename.elc (и запускается фоновая нативная компиляция для создания отсутствующего файла «.eln», после чего загружается этот файл). Если файла filename.elc нет, load ищет файл с именем filename.el. Если такой файл существует, он загружается. Если Emacs был собран с поддержкой динамических модулей (см. Динамические модули Emacs), load затем ищет файл с именем filename.ext, где ext — зависящее от системы расширение имени файла общей библиотеки («.so» в системах GNU и Unix). Наконец, если ни один из этих файлов не найден, load ищет файл с именем filename без добавленного расширения и загружает его, если он существует. (Функция load не слишком умна при обработке filename. В необычном случае, когда файл называется foo.el.el, при вычислении (load "foo.el") он действительно будет найден.)

Если включён режим Auto Compression, как это происходит по умолчанию, то, если load не удаётся найти файл, перед поиском файлов с другими именами она ищет сжатую версию файла. Если такая версия существует, она распаковывается и загружается. Сжатые версии ищутся путём добавления к имени файла каждого из суффиксов, указанных в jka-compr-load-suffixes. Значением этой переменной должен быть список строк. Её стандартное значение — (".gz").

Если необязательный аргумент nosuffix не равен nil, load не пытается добавлять суффиксы «.elc» и «.el». В этом случае необходимо указать точное имя нужного файла, за исключением того, что при включённом режиме Auto Compression load всё равно использует jka-compr-load-suffixes для поиска сжатых версий. Указав точное имя файла и задав t для nosuffix, можно предотвратить попытки загрузить файлы с именами вроде foo.el.el.

Если необязательный аргумент must-suffix не равен nil, load требует, чтобы имя используемого файла оканчивалось на «.el» или «.elc» (возможно, с добавленным суффиксом сжатия) либо на расширение общей библиотеки, если только оно не содержит явного имени каталога.

Если параметр load-prefer-newer не равен nil, то при поиске по суффиксам load выбирает наиболее поздно изменённую версию файла («.elc», «.el» и т. д.). В этом случае load не загружает файл «.eln», скомпилированный в машинный код, даже если он существует.

Если filename — относительное имя файла, например foo или baz/foo.bar, load ищет файл, используя переменную load-path. Она добавляет filename к каждому из каталогов, перечисленных в load-path, и загружает первый найденный файл с подходящим именем. Текущий каталог по умолчанию проверяется только в том случае, если он указан в load-path, где nil обозначает каталог по умолчанию. load проверяет все три возможных суффикса в первом каталоге из load-path, затем все три суффикса во втором каталоге и так далее. См. Поиск библиотек.

Независимо от того, под каким именем в итоге был найден файл и в каком каталоге Emacs его обнаружил, Emacs присваивает переменной load-file-name имя этого файла.

Если вы получили предупреждение о том, что foo.elc старее foo.el, это означает, что вам следует перекомпилировать foo.el. См. Байткодовая компиляция.

При загрузке исходного файла (не скомпилированного) load выполняет преобразование кодировки символов так же, как это сделал бы Emacs при посещении файла. См. Системы кодирования.

При загрузке нескомпилированного файла Emacs пытается развернуть все содержащиеся в нём макросы (см. Макросы). Это называется заблаговременным раскрытием макросов. Такая обработка (вместо откладывания раскрытия до выполнения соответствующего кода) может значительно ускорить выполнение нескомпилированного кода. Иногда раскрыть макросы невозможно из-за циклической зависимости. Простейший пример: загружаемый файл обращается к макросу, определённому в другом файле, а тот файл, в свою очередь, требует загрузки исходного файла. Emacs выдаст сообщение об ошибке «Eager macro-expansion skipped due to cycle…» с подробностями проблемы. Необходимо изменить структуру кода, чтобы избежать такой ситуации. Загрузка скомпилированного файла не вызывает раскрытия макросов, поскольку оно должно было произойти во время компиляции. См. Макросы и байткодовая компиляция.

Во время загрузки в области эха появляются сообщения, например «Loading foo...» и «Loading foo...done», если nomessage не равен nil. Если загружается файл «.eln», скомпилированный в машинный код, об этом сообщается в сообщении.

Любые необработанные ошибки при загрузке файла прекращают загрузку. Если загрузка выполнялась ради autoload, все определения функций, созданные во время загрузки, отменяются.

Если load не удаётся найти загружаемый файл, обычно она сигнализирует file-error (с сообщением «Cannot open load file filename»). Однако если missing-ok не равен nil, load просто возвращает nil.

С помощью переменной load-read-function можно задать функцию, которую load будет использовать для чтения выражений вместо read. См. ниже.

Если загрузка файла прошла успешно, load возвращает t.

Команда: load-file filename

Эта команда загружает файл filename. Если filename — относительное имя файла, используется текущий каталог по умолчанию. Эта команда не использует load-path и не добавляет суффиксы. Однако она ищет сжатые версии файла (если включён режим Auto Compression). Используйте эту команду, если хотите точно указать имя загружаемого файла.

Команда: load-library library

Эта команда загружает библиотеку с именем library. Она эквивалентна load, за исключением способа интерактивного чтения аргумента. См. Библиотеки Lisp в Руководстве по GNU Emacs.

Переменная: load-in-progress

Значение этой переменной не равно nil, если Emacs загружает файл, и равно nil в противном случае.

Переменная: load-file-name

Когда Emacs загружает файл, значением этой переменной является имя этого файла, найденное Emacs при поиске, описанном ранее в этом разделе.

Переменная: load-read-function

Эта переменная задаёт альтернативную функцию чтения выражений, которую load и eval-region будут использовать вместо read. Функция должна принимать один аргумент, как и read.

По умолчанию значением этой переменной является read. См. Функции ввода.

Вместо этой переменной удобнее использовать другую, более новую возможность: передать функцию в качестве аргумента read-function функции eval-region. См. Вычисление.

Функция: load-path-filter-cache-directory-files path filename suffixes

Эта функция фильтрует path, удаляя каталоги, в которых не может находиться filename с любым из суффиксов suffixes, и возвращает отфильтрованный список каталогов. Функция кэширует просматриваемые каталоги и содержащиеся в них файлы, а при последующих вызовах использует кэш, что ускоряет повторный поиск файлов в path.

Переменная: load-path-filter-function

Если эта переменная содержит имя функции, load вызовет эту функцию при просмотре load-path в поисках файлов. Функция будет вызвана с тремя аргументами: значением load-path, filename — именем искомого файла, переданным в load, — и списком суффиксов, добавляемых к filename. Она должна возвращать более короткий список каталогов, в которых может находиться filename, тем самым ускоряя поиск. Функция load-path-filter-cache-directory-files хорошо подходит для этой цели.

Сведения об использовании load при сборке Emacs см. в разделе Сборка Emacs.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/How-Programs-Do-Loading.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API