14.6 Отступы макросов

Внутри определения макроса вы можете использовать форму declare (см. Определение макросов), чтобы указать, как TAB должен отступать вызовы макроса. Спецификация отступа записывается следующим образом:

(declare (indent indent-spec))

Это устанавливает свойство lisp-indent-function для имени макроса.

Ниже приведены возможности для indent-spec:

nil

Это то же самое, что отсутствие свойства — используется стандартный шаблон отступа.

defun

Обрабатывайте эту функцию как конструкцию def: рассматривайте вторую строку как начало тела.

целое число, number

Первые number аргументы функции являются дифференцированными аргументами; остальные считаются телом выражения. Строка в выражении отступает в соответствии с тем, является ли первый аргумент в ней дифференцированным или нет. Если аргумент является частью тела, строка отступает на lisp-body-indent больше столбцов, чем открывающая скобка, начинающая содержащее выражение. Если аргумент дифференцирован и является первым или вторым аргументом, он отступает в два раза больше этих дополнительных столбцов. Если аргумент дифференцирован, но не является первым или вторым аргументом, строка использует стандартный шаблон.

символ, symbol

symbol должен быть именем функции; эта функция вызывается для вычисления отступа строки внутри этого выражения. Функция принимает два аргумента:

pos

Позиция, с которой начинается строка, которую нужно отступить.

state

Значение, возвращенное parse-partial-sexp (примитив Lisp для вычисления отступов и вложенности), когда он парсит до начала этой строки.

Она должна вернуть либо число, которое является количеством столбцов отступа для этой строки, либо список, чей первый элемент — такое число. Разница между возвратом числа и возвратом списка в том, что число говорит о том, что все последующие строки на том же уровне вложенности должны иметь отступ точно такой же, как и эта; а список говорит о том, что последующие строки могут потребовать разного отступа. Это имеет значение, когда отступ вычисляется с помощью C-M-q; если значение является числом, C-M-q не нужно пересчитывать отступ для последующих строк до конца списка.