Как программы выполняют загрузку
В Emacs Lisp есть несколько интерфейсов для загрузки. Например, autoload создает объект-заполнитель для функции, определенной в файле; попытка вызвать функцию автозагрузки загружает файл, чтобы получить реальное определение функции (см. Автозагрузку). require загружает файл, если он еще не загружен (см. Именованные возможности). В конечном счете, все эти средства вызывают функцию load для выполнения работы.
- Функция: load filename &optional missing-ok nomessage nosuffix must-suffix
-
Эта функция находит и открывает файл Lisp-кода, вычисляет все формы в нём и закрывает файл.
Для поиска файла
loadсначала ищет файл с именем filename.elc, то есть файл с именем filename с добавленным расширением «.elc». Если такой файл существует, и Emacs был скомпилирован с поддержкой нативной компиляции (см. Нативная компиляция),loadпытается найти соответствующий файл «.eln», и если он найден, загружает его вместо filename.elc. В противном случае, он загружает filename.elc. Если такого файла нет, тоloadищет файл с именем filename.el. Если этот файл существует, он загружается. Если Emacs был скомпилирован с поддержкой динамических модулей (см. Динамические модули),loadдалее ищет файл с именем filename.ext, где ext — системно-зависимое расширение имени файла для общих библиотек. Наконец, если ни один из этих файлов не найден,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 выводит предупреждение («Жадно расширение макросов пропущено из-за цикла…»), предоставляя подробности о проблеме, но всё равно загружает файл, просто оставив макрос нерасширенным на данный момент. Возможно, вы захотите перестроить свой код, чтобы этого не происходило. Загрузка скомпилированного файла не вызывает расширения макросов, потому что это уже должно было произойти во время компиляции. См. Компиляция макросов.
Сообщения, такие как «Загрузка foo...» и «Загрузка foo... завершена», появляются в области эха во время загрузки, если nomessage не равно
nil. Если загружается нативно скомпилированный файл «.eln», сообщение об этом будет соответствующим.Любые необработанные ошибки при загрузке файла прекращают загрузку. Если загрузка была выполнена для
autoload, все определения функций, созданные во время загрузки, отменяются.Если
loadне может найти файл для загрузки, то обычно он сигнализирует об ошибкеfile-error(с «Не могу открыть файл загрузки filename»). Но если missing-ok не равноnil, тоloadпросто возвращаетnil.Вы можете использовать переменную
load-read-functionдля указания функции, которуюloadдолжен использовать вместоreadдля чтения выражений. См. ниже.loadвозвращаетtв случае успешной загрузки файла.
- Команда: load-file filename
Эта команда загружает файл filename. Если filename — относительное имя файла, то предполагается текущая директория по умолчанию. Эта команда не использует
load-path, и не добавляет расширений. Однако она ищет сжатые версии (если режим автосжатия включён). Используйте эту команду, если вы хотите указать точное имя загружаемого файла.
- Команда: 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 используется при сборке Emacs, см. в Сборке Emacs.
Copyright © 1990-1996, 1998-2022 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