22.2.1 Использование interactive

В этом разделе описывается, как писать форму interactive, которая делает функцию Lisp интерактивно вызываемой командой, а также как исследовать форму interactive команды.

Специальная форма: interactive &optional arg-descriptor &rest modes

Эта специальная форма объявляет, что функция является командой и, следовательно, может вызываться интерактивно (через M-x или вводом последовательности клавиш, привязанной к ней). Аргумент arg-descriptor определяет, как вычислять аргументы команды при её интерактивном вызове.

Команда может вызываться из программ на Lisp, как и любая другая функция, но в этом случае вызывающий передаёт аргументы, и arg-descriptor не оказывает влияния.

Форма interactive должна находиться на верхнем уровне в теле функции или в свойстве interactive-form символа функции (см. Свойства символов). Она оказывает своё действие, потому что командный цикл ищет её перед вызовом функции (см. Интерактивный вызов). После вызова функции выполняются все формы её тела; в этот момент, если форма interactive встречается внутри тела, она просто возвращает nil, даже не вычисляя свой аргумент.

Список modes позволяет указать, в каких режимах предполагается использовать команду. Подробнее о действии указания modes и о том, когда его использовать, см. Указание режимов для команд.

Согласно соглашению, следует помещать форму interactive в тело функции первой формой на верхнем уровне. Если форма interactive присутствует и в свойстве символа interactive-form, и в теле функции, приоритет имеет первая. Свойство символа interactive-form можно использовать для добавления интерактивной формы к существующей функции или изменения способа интерактивной обработки её аргументов без переопределения функции.

Для аргумента arg-descriptor возможны три варианта:

Функция: interactive-form function

Эта функция возвращает форму interactive функции function. Если function является интерактивно вызываемой функцией (см. Интерактивный вызов), возвращаемое значение — это форма interactive команды (interactive spec), которая определяет, как вычислять её аргументы. В противном случае значение равно nil. Если function является символом, используется его определение функции. При вызове на OClosure работа делегируется обобщённой функции oclosure-interactive-form.

Функция: oclosure-interactive-form function

Как и interactive-form, эта функция принимает команду и возвращает её интерактивную форму. Отличие в том, что это обобщённая функция, и она вызывается только когда function является OClosure (см. Открытые замыкания). Цель — дать возможность некоторым типам OClosure динамически вычислять свои интерактивные формы вместо хранения их в одном из своих слотов.

Это используется, например, для функций kmacro, чтобы уменьшить их размер в памяти, поскольку все они используют одну и ту же интерактивную форму. Это также используется для функций advice, где интерактивная форма вычисляется на основе интерактивных форм её компонентов, чтобы выполнять это вычисление более лениво и правильно корректировать интерактивную форму при переопределении одного из её компонентов.


Сноски

(17)

Некоторые элементы фактически передают два аргумента.