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