Spec-Zone.ru › Elisp

Список спецификаций

Список спецификаций требуется для спецификации 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 является отдельной альтернативой. Чтобы сгруппировать два или более элементов списка как одну альтернативу, заключите их в […].

&not

Каждый из последующих элементов сопоставляется как альтернативы, как если бы они использовали &or, но если любой из них соответствует, спецификация терпит неудачу. Если ни один из них не соответствует, ничего не сопоставляется, но спецификация &not имеет успех.

&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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API