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 был скомпилирован с поддержкой нативной компиляции (см. Нативная компиляция), 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

Spec-Zone.ru

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