Как программы выполняют загрузку
В 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 Compressionloadвсё равно использует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