Emacs Lisp имеет несколько интерфейсов для загрузки. Например,
autoload создаёт объект-заполнитель для функции, определённой в
файле; попытка вызвать функцию авто-загрузки загружает файл, чтобы получить
реальное определение функции (см. Авто-загрузка). require загружает
файл, если он ещё не загружен (см. Особенности). В конечном счёте,
все эти средства вызывают функцию load для выполнения работы.
Эта функция находит и открывает файл с кодом 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") действительно
найдёт его.)
Если включён режим автоматического сжатия, как это по умолчанию, то если
load не может найти файл, он ищет сжатую версию
файла перед попыткой использовать другие имена файлов. Он распаковывает и загружает
его, если он существует. Он ищет сжатые версии, добавляя каждый
из суффиксов в jka-compr-load-suffixes к имени файла.
Значение этой переменной должно быть списком строк. Её стандартное
значение — (".gz").
Если необязательный аргумент nosuffix отличен от nil, то
load не использует суффиксы ‘.elc’ и ‘.el’. В
этом случае вы должны указать точное имя файла, которое хотите, за
исключением того, что если включён режим автоматического сжатия, 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, если файл загружается успешно.
Эта команда загружает файл filename. Если filename является
относительным именем файла, то предполагается текущий каталог по умолчанию.
Эта команда не использует load-path и не добавляет
суффиксы. Однако она ищет сжатые версии (если включён
режим автоматического сжатия). Используйте эту команду, если хотите указать
точно имя файла для загрузки.
Эта команда загружает библиотеку с именем library. Она эквивалентна
load, за исключением способа интерактивного чтения аргумента.
См. Библиотеки Lisp в Руководстве GNU Emacs.
Эта переменная отлична от nil, если Emacs находится в процессе загрузки
файла, и равна nil в противном случае.
Когда Emacs находится в процессе загрузки файла, значение этой переменной равно имени этого файла в том виде, в котором Emacs нашёл его во время поиска, описанного ранее в этом разделе.
Эта переменная задаёт альтернативную функцию чтения выражений для
load и eval-region вместо read.
Функция должна принимать один аргумент, как и read.
По умолчанию значение этой переменной — read. См. Функции ввода.
Вместо использования этой переменной более чисто использовать другую, более новую
возможность: передавать функцию в качестве аргумента read-function в
eval-region. См. Eval.
Сведения о том, как load используется при сборке Emacs, см.
Сборка Emacs.