Список спецификаций требуется для спецификации Edebug, если
некоторые аргументы вызова макроса вычисляются, а другие — нет. Некоторые
элементы в списке спецификаций сопоставляются с одним или несколькими аргументами, но другие
изменяют обработку всех последующих элементов. Последние называются
ключевыми словами спецификации и представляют собой символы, начинающиеся с «‘&» (такие
как &optional).
Список спецификаций может содержать подсписки, которые сопоставляются с аргументами, сами являющимися списками, или может содержать векторы, используемые для группировки. Подсписки и группы, таким образом, подразделяют список спецификаций на иерархию уровней. Ключевые слова спецификации применяются только к оставшейся части подсписка или группы, в которой они содержатся.
Когда список спецификаций включает альтернативы или повторения, его сопоставление с фактическим вызовом макроса может потребовать возврата. Подробнее см. Возврат при сопоставлении в спецификациях.
Спецификации Edebug обеспечивают мощность сопоставления с регулярными выражениями, а также некоторые конструкции грамматик контекстно-свободного типа: сопоставление подсписков со сбалансированными скобками, рекурсивную обработку форм и рекурсию через косвенные спецификации.
Вот таблица возможных элементов списка спецификаций с их значениями (см. Примеры спецификаций, для упомянутых примеров):
sexpОдин невычисляемый объект Lisp, который не инструментируется.
Если макрос вычисляет аргумент на этапе раскрытия макроса, вам следует
использовать sexp для него, а не form.
formОдно вычисляемое выражение, которое инструментируется. Если ваш макрос
оборачивает выражение в lambda перед его вычислением, используйте
def-form вместо этого. См. def-form ниже.
placeОбобщённая переменная. См. Обобщённые переменные.
bodyСокращение для &rest form. См. &rest ниже. Если ваш макрос
оборачивает своё тело кода в lambda перед его вычислением, используйте
def-body вместо этого. См. def-body ниже.
lambda-exprЛямбда-выражение без кавычек.
&optionalВсе последующие элементы в списке спецификаций являются необязательными; как только один не совпадает, Edebug прекращает сопоставление на этом уровне.
Чтобы сделать необязательными только несколько элементов, за которыми следуют обязательные элементы,
используйте [&optional спецификации…]. Чтобы указать, что несколько
элементов должны либо все совпадать, либо ни один, используйте &optional
[спецификации…]. См. пример defun.
&restВсе последующие элементы в списке спецификаций повторяются ноль или более раз. Однако в последнем повторении не является проблемой, если выражение заканчивается до того, как будут сопоставлены все элементы списка спецификаций.
Чтобы повторить только несколько элементов, используйте [&rest спецификации…].
Чтобы указать несколько элементов, которые должны все совпадать при каждом повторении, используйте
&rest [спецификации…].
&orКаждый из следующих элементов в списке спецификаций является альтернативой.
Одна из альтернатив должна совпадать, иначе спецификация &or
завершается неудачей.
Каждый элемент списка после &or является отдельной альтернативой. Чтобы
сгруппировать два или более элемента списка как одну альтернативу, заключите их в
[…].
¬Каждый из следующих элементов сопоставляется как альтернативы, как если бы с использованием
&or, но если любой из них совпадает, спецификация завершается неудачей. Если ни один
из них не совпадает, ничего не сопоставляется, но спецификация ¬
завершается успешно.
&defineУказывает, что спецификация предназначена для определяющей формы. Определение Edebug для определяющей формы — это форма, содержащая одну или несколько кодовых форм, которые сохраняются и выполняются позже, после выполнения определяющей формы.
Сама определяющая форма не инструментируется (то есть Edebug не
останавливается перед и после определяющей формы), но формы внутри неё
обычно инструментируются. Ключевое слово &define должно быть
первым элементом в списке спецификаций.
nilЭто завершается успешно, когда на текущем уровне списка аргументов больше нет аргументов для сопоставления; в противном случае завершается неудачей. См. спецификации подсписков и пример с обратной кавычкой.
gate ¶Никакой аргумент не сопоставляется, но возврат через gate отключается
во время сопоставления оставшейся части спецификаций на этом уровне. Это
используется в первую очередь для генерации более конкретных сообщений об ошибках синтаксиса. См.
Возврат при сопоставлении в спецификациях для получения более подробной информации. Также см. пример let.
&errorЗа &error должна следовать строка, сообщение об ошибке, в
edebug-spec; это прерывает инструментирование, отображая сообщение в
минибуфере.
&interposeПозволяет функции управлять разбором оставшегося кода.
Она имеет форму &interpose спецификация fun args...
и означает, что Edebug сначала сопоставит спецификацию с кодом, а
затем вызовет fun с кодом, который сопоставился с спецификацией, функцией разбора
pf и, наконец, args.... Функция разбора
ожидает один аргумент, указывающий список спецификаций
для разбора оставшегося кода. Она должна быть вызвана ровно один раз
и возвращает инструментированный код, который, как ожидается, вернёт fun.
Например, (&interpose symbolp pcase--match-pat-args) сопоставляет
sexps, первый элемент которых является символом, а затем позволяет
pcase--match-pat-args искать спецификации, связанные
с этим заголовочным символом, согласно pcase--match-pat-args, и
передать их функции pf, полученной в качестве аргумента.
other-symbol ¶Любой другой символ в списке спецификаций может быть предикатом или косвенной спецификацией.
Если символ имеет спецификацию Edebug, эта косвенная
спецификация должна быть либо списком спецификаций, который используется
вместо символа, либо функцией, которая вызывается для обработки
аргументов. Спецификация может быть определена с помощью
def-edebug-elem-spec:
Определяет спецификацию для использования вместо символа элемент. спецификация должна быть списком.
В противном случае символ должен быть предикатом. Предикат вызывается
с аргументом, и если предикат возвращает nil, спецификация
завершается неудачей, и аргумент не инструментируется.
Некоторые подходящие предикаты включают symbolp, integerp,
stringp, vectorp и atom.
[элементы…] ¶Вектор элементов группирует элементы в единую групповую спецификацию. Его значение не имеет отношения к векторам.
"строка"Аргумент должен быть символом с именем строка. Эта спецификация
эквивалентна заключённому в кавычки символу 'символ, где имя
символа — это строка, но предпочтительнее строковая форма.
(vector элементы…)Аргумент должен быть вектором, элементы которого должны соответствовать элементам в спецификации. См. пример с обратной кавычкой.
(элементы…)Любой другой список является спецификацией подсписка, и аргумент должен быть списком, элементы которого соответствуют спецификации элементы.
Спецификация подсписка может быть точечным списком, и соответствующий список
аргументов тогда также может быть точечным списком. Альтернативно, последний CDR
спецификации точечного списка может быть другой спецификацией подсписка (через
группировку или косвенную спецификацию, например, (spec . [(more
specs…)])), элементы которой соответствуют неточечным аргументам-спискам.
Это полезно в рекурсивных спецификациях, как в примере с обратной кавычкой.
Также см. описание спецификации nil
выше для завершения такой рекурсии.
Обратите внимание, что спецификация подсписка, записанная как (specs . nil),
эквивалентна (specs), а (specs .
(sublist-elements…)) эквивалентна (specs
sublist-elements…).
Вот список дополнительных спецификаций, которые могут появляться только после
&define. См. пример defun.
&nameИзвлекает имя текущей определяющей формы из кода.
Она имеет форму &name [предстрока] спецификация
[постстрока] fun args... и означает, что Edebug
сопоставит спецификацию с кодом, а затем вызовет fun с
конкатенацией текущего имени, args..., предстроки,
кода, который сопоставился с спецификацией, и постстроки. Если
fun отсутствует, по умолчанию используется функция, которая конкатенирует аргументы
(с @ между предыдущим именем и новым).
nameАргумент, символ, является именем определяющей формы.
Сокращение для [&name symbolp].
Определяющая форма не обязана иметь поле имени; и она может иметь несколько полей имени.
argАргумент, символ, является именем аргумента определяющей формы. Однако ключевые слова lambda-списка (символы, начинающиеся с «‘&») не допускаются.
lambda-list ¶Это сопоставляет lambda-список — список аргументов lambda-выражения.
def-bodyАргумент является телом кода в определении. Это похоже на
body, описанное выше, но тело определения должно инструментироваться
с другим вызовом Edebug, который ищет информацию, связанную с
определением. Используйте def-body для списка форм самого верхнего уровня
в определении.
def-formАргумент является одной формой самого верхнего уровня в определении. Это
похоже на def-body, за исключением того, что используется для сопоставления одной формы, а не
списка форм. В качестве особого случая def-form также означает, что
информация трассировки не выводится при выполнении формы. См.
пример interactive.