22.2 Определение команд

Специальная форма interactive превращает функцию Lisp в команду. Форма interactive должна находиться на верхнем уровне в теле функции, обычно в качестве первой формы в теле; это относится как к лямбда-выражениям (см. Лямбда-выражения), так и к формам defun (см. Определение функций). Эта форма ничего не делает во время фактического выполнения функции; её наличие служит флагом, сообщающим циклу команд Emacs, что функцию можно вызывать интерактивно. Аргумент формы interactive задаёт, как должны считываться аргументы для интерактивного вызова.

Кроме того, форма interactive может быть задана в свойстве interactive-form символа функции. Значение этого свойства, отличное от nil, имеет приоритет над любой формой interactive в самом теле функции. Эта возможность используется редко.

Иногда функция предназначена только для интерактивного вызова и никогда — для непосредственного вызова из Lisp. В таком случае задайте функции свойство interactive-only, отличное от nil, либо напрямую, либо через declare (см. Форма declare). Это заставит компилятор байт-кода выдавать предупреждение, если команда вызывается из Lisp. Вывод describe-function будет содержать аналогичную информацию. Значением свойства может быть: строка, которую компилятор байт-кода будет напрямую использовать в своём предупреждении (она должна заканчиваться точкой и не начинаться с заглавной буквы, например, "используйте (system-name) вместо этого."); t; любой другой символ, который должен указывать альтернативную функцию для использования в коде Lisp.

Обобщённые функции (см. Обобщённые функции) нельзя превратить в команды добавлением к ним формы interactive.