Spec-Zone.ru › Elisp

Указание компилятору, что функция определена

Компиляция файла часто порождает предупреждения о функциях, которые компилятор не знает (см. Ошибки компилятора). Иногда это указывает на реальную проблему, но обычно функции, о которых идет речь, определены в других файлах, которые будут загружены при выполнении кода. Например, при компиляции simple.el раньше выдавалось предупреждение:

simple.el:8727:1:Warning: the function ‘shell-mode’ is not known to be
    defined.

Фактически, shell-mode используется только в функции, которая выполняет (require 'shell) перед вызовом shell-mode, поэтому shell-mode будет должным образом определено во время выполнения. Если известно, что такое предупреждение не указывает на реальную проблему, то хорошо подавить это предупреждение. Это сделает новые предупреждения, которые могут означать реальные проблемы, более заметными. Это делается с помощью declare-function.

Всё, что вам нужно сделать, это добавить инструкцию declare-function перед первым использованием соответствующей функции:

(declare-function shell-mode "shell" ())

Это означает, что shell-mode определена в shell.el (‘.el’ можно опустить). Компилятор принимает на веру, что этот файл действительно определяет функцию, и не проверяет.

Необязательный третий аргумент задаёт список аргументов shell-mode. В этом случае он не принимает аргументы (nil отличается от того, чтобы не указывать значение). В других случаях это может быть что-то вроде (file &optional overwrite). Вы не обязаны указывать список аргументов, но если вы это сделаете, компилятор байт-кода может проверить, что вызовы соответствуют объявлению.

Макрос: declare-function function file &optional arglist fileonly

Укажите компилятору байт-кода предположить, что function определена в файле file. Необязательный третий аргумент arglist либо t, что означает, что список аргументов не указан, либо список формальных параметров в том же стиле, что и defun. Пропущенный arglist по умолчанию равен t, а не nil; это необычное поведение для пропущенных аргументов, и это означает, что для указания четвёртого, но не третьего аргумента нужно указать t для места третьего аргумента вместо обычного nil. Необязательный четвёртый аргумент fileonly если не nil, означает проверку только существования file, а не того, что он фактически определяет function.

Чтобы проверить, что эти функции действительно объявлены там, где declare-function говорит, что они есть, используйте check-declare-file для проверки всех declare-function вызовов в одном исходном файле или используйте check-declare-directory для проверки всех файлов в и под определённой директорией.

Эти команды находят файл, который должен содержать определение функции, используя locate-library; если это не находит файл, они расширяют имя файла определения относительно директории файла, который содержит вызов declare-function.

Вы также можете указать, что функция является примитивной, указав имя файла, заканчивающееся на ‘.c’ или ‘.m’. Это полезно только тогда, когда вы вызываете примитив, определённый только на определённых системах. Большинство примитивов всегда определены, поэтому они никогда не дадут вам предупреждение.

Иногда файл необязательно использует функции из внешнего пакета. Если вы добавите префикс к имени файла в инструкции declare-function с ‘ext:’, то будет проверено, найдено ли оно, в противном случае пропущено без ошибки.

Существуют некоторые определения функций, которые ‘check-declare’ не понимает (например, defstruct и некоторые другие макросы). В таких случаях вы можете передать аргумент fileonly, отличный от nil, в declare-function, что означает проверку только существования файла, а не того, что он фактически определяет функцию. Обратите внимание, что для этого без необходимости указывать список аргументов, вы должны установить аргумент arglist в t (потому что nil означает пустой список аргументов, а не неопределённый).

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/Declaring-Functions.html

Spec-Zone.ru

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