Spec-Zone.ru › Elisp

Функции

provide и require являются альтернативой autoload для автоматической загрузки файлов. Они работают с именованными функциями. Автозагрузка запускается вызовом определенной функции, но функция загружается в первый раз, когда другой программа запросит ее по имени.

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

Чтобы потребовать наличие функции, вызовите require с именем функции в качестве аргумента. require ищет в глобальной переменной features, было ли уже предоставлено требуемое свойство. Если нет, оно загружает функцию из соответствующего файла. Этот файл должен вызвать provide в верхнем уровне, чтобы добавить функцию в features; если это не удается, require сигнализирует об ошибке.

Например, в idlwave.el, определение для idlwave-complete-filename включает следующий код:

(defun idlwave-complete-filename ()
  "Use the comint stuff to complete a file name."
   (require 'comint)
   (let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-")
          (comint-completion-addsuffix nil)
          ...)
       (comint-dynamic-complete-filename)))

Выражение (require 'comint) загружает файл comint.el, если он еще не загружен, гарантируя, что comint-dynamic-complete-filename определено. Функции обычно называются по имени файлов, которые их предоставляют, так что require не нужно указывать имя файла. (Обратите внимание, что важно, чтобы утверждение require находилось вне тела let. Загрузка библиотеки, пока ее переменные связаны с let, может иметь непредвиденные последствия, а именно, переменные станут несвязанными после выхода из let.)

Файл comint.el содержит следующее выражение верхнего уровня:

(provide 'comint)

Это добавляет comint в глобальный список features, чтобы (require 'comint) впредь знал, что ничего делать не нужно.

Когда require используется на верхнем уровне в файле, оно вступает в силу при байткомпаляции этого файла (см. Байткомпаляция), а также при его загрузке. Это в случае, если требуемый пакет содержит макросы, о которых компилятор должен знать. Это также позволяет избежать предупреждений компилятора байт-кода для функций и переменных, определенных в файле, загруженном с помощью require.

Хотя вызовы require на верхнем уровне оцениваются во время байткомпаляции, вызовы provide не оцениваются. Поэтому вы можете убедиться, что файл определений загружается до его байткомпаляции, включив provide за которым следует require для той же функции, как в следующем примере.

(provide 'my-feature)  ; Ignored by byte compiler,
                       ;   evaluated by load.
(require 'my-feature)  ; Evaluated by byte compiler.

Компилятор игнорирует provide, затем обрабатывает require путем загрузки соответствующего файла. Загрузка файла выполняет вызов provide, поэтому последующий вызов require ничего не делает при загрузке файла.

Функция: provide feature &optional subfeatures

Эта функция объявляет, что feature сейчас загружен или загружается в текущей сессии Emacs. Это означает, что средства, связанные с feature, доступны или будут доступны другим программам Lisp.

Прямой эффект вызова provide заключается в добавлении feature в начало списка features, если он еще не присутствует в нем, и вызове любого кода eval-after-load ожидающего его (см. Обработчики загрузки). Аргумент feature должен быть символом. provide возвращает feature.

Если предоставлены, subfeatures должны быть списком символов, указывающих на набор конкретных дополнительных функций, предоставляемых этой версией feature. Вы можете проверить наличие дополнительной функции, используя featurep. Идея дополнительных функций заключается в том, что вы используете их, когда пакет (который является одной feature) достаточно сложен, чтобы было полезно давать имена различным частям или функциональности пакета, которые могут или не могут загружаться, или могут или не могут присутствовать в данной версии. Смотрите Тестирование функций сети для примера.

features
     ⇒ (bar bish)

(provide 'foo)
     ⇒ foo
features
     ⇒ (foo bar bish)

Когда файл загружается для удовлетворения автозагрузки, и он останавливается из-за ошибки в оценке его содержимого, все определения функций или вызовы provide которые произошли во время загрузки, отменяются. См. Autoload.

Функция: require feature &optional filename noerror

Эта функция проверяет, присутствует ли feature в текущей сессии Emacs (используя (featurep feature); см. ниже). Аргумент feature должен быть символом.

Если функция отсутствует, то require загружает filename с помощью load. Если filename не указан, имя символа feature используется в качестве базового имени файла для загрузки. Однако в этом случае require настаивает на поиске feature с добавленным суффиксом «.el» или «.elc» (возможно, с расширением суффикса сжатия); файл, имя которого просто feature не будет использован. (Переменная load-suffixes указывает на точные требуемые суффиксы Lisp.)

Если noerror не nil, это подавляет ошибки при фактической загрузке файла. В этом случае require возвращает nil, если загрузка файла завершается ошибкой. Обычно require возвращает feature.

Если загрузка файла проходит успешно, но не предоставляет feature, require сигнализирует об ошибке отсутствия функции.

Функция: featurep feature &optional subfeature

Эта функция возвращает t если feature был предоставлен в текущей сессии Emacs (т.е., если feature является членом features). Если subfeature не nil, функция возвращает t только если эта дополнительная функция также предоставлена (т.е., если subfeature является членом свойства subfeature символа feature.)

Переменная: features

Значение этой переменной — список символов, являющихся функциями, загруженными в текущей сессии Emacs. Каждый символ был добавлен в этот список с вызовом provide. Порядок элементов в списке features не важен.

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/Named-Features.html

Spec-Zone.ru

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