Spec-Zone.ru › Elisp

Макрос cond*

Вы можете использовать макрос cond* вместо pcase, если синтаксис pcase кажется вам слишком загадочным. Кроме того, cond* предлагает новые формы управления потоком, не связанные с тем, чтобы быть альтернативой pcase.

Макрос: cond* &rest clauses

Макрос cond* — это расширенная форма традиционного cond. Выражение cond* содержит последовательность clauses; в каждой из них можно использовать bind* или bind-and* для задания связываемых переменных, match* или pcase* для задания сопоставления с образцом в качестве условия либо выражение, вычисляемое как проверка условия.

Обычно каждая ветвь имеет форму (condition body…).

condition может быть выражением Lisp, как в cond (см. Условные конструкции). Также это может быть (bind* bindings…), (match* pattern datum), (bind-and* bindings…) или (pcase* pattern datum)

(bind* bindings…) означает, что для тела ветви и всех последующих ветвей связываются переменные bindings (как в списке связей let*, см. Локальные переменные). В качестве условия эта форма считается истинной, если значение первой связи не равно nil.

(bind-and* bindings…) означает, что переменные bindings (как в списке связей if-let*, см. Условные конструкции) связываются только для тела ветви. В качестве условия эта форма считается истинной, если ни одна из связей не вычисляется в nil. Кроме того, если какая-либо связь вычисляется в nil, выражения для значений последующих связей не вычисляются.

(match* pattern datum) означает сопоставление datum с указанным pattern. Условие считается истинным, если pattern соответствует datum. В образце можно указать переменные, связываемые с соответствующими частями datum. (pcase* pattern datum) работает так же, но использует синтаксис Pcase для pattern.

Обычно match* и pcase* связывают переменные на время выполнения всей содержащей их ветви. Однако если ветвь задана как «без выхода» (см. ниже), её связи охватывают всю оставшуюся часть конструкции cond*.

Когда условие ветви истинно и выполнение выходит из cond* или эта ветвь последняя, значение последнего выражения в теле ветви становится возвращаемым значением конструкции cond*.

Ветви без выхода

Если первый элемент ветви — это t или форма bind*, либо если ветвь содержит только один элемент и этот элемент — форма match* или pcase*, либо если она заканчивается ключевым словом :non-exit, то выполнение этой ветви не выходит из конструкции cond*. Вместо этого управление переходит к следующей ветви (если она есть). За исключением ветви bind-and*, связи, созданные в condition, доступны в body ветви без выхода и передаются последующим ветвям этой конструкции cond*.

Примечание: pcase* не поддерживает :non-exit, а при использовании в ветви без выхода работает согласно семантике pcase-let; см. Деструктуризация с образцами pcase.

Ветви сопоставления

Ветвь сопоставления имеет вид (match* pattern datum). Она вычисляет выражение datum и сопоставляет с ним образец pattern (который не вычисляется).

pattern допускает следующие типы образцов; списки часто содержат внутри себя другие образцы:

_

Соответствует любому значению.

keyword

Соответствует этому ключевому слову.

nil

Соответствует nil.

t

Соответствует t.

symbol

Соответствует любому значению и связывает symbol с этим значением. Если symbol уже сопоставлялся и связывался ранее в этом образце, здесь ему соответствует то же значение, что и при предыдущем сопоставлении.

regexp

Соответствует строке, если ей соответствует regexp. Совпадение должно охватывать всю строку — от первого до последнего символа.

atom

(То есть любой другой тип не-списка, не описанный выше.) Соответствует любому значению, «равному» ему.

(rx regexp)

Использует регулярное выражение, заданное в форме S-выражения, как в функции rx (см. Структурированная нотация регулярных выражений rx), и выполняет сопоставление с данными таким образом.

(rx regexp sym0 sym1…)

Использует регулярное выражение, заданное в форме S-выражения, и связывает символы sym0, sym1 и так далее с (match-string 0 datum), (match-string 1 datum) и так далее. Можно использовать столько символов sym, сколько поддерживает сопоставление с регулярным выражением.

`object

Соответствует любому значению, equal объекту object.

(cons carpat cdrpat)

Соответствует конс-ячейке, если carpat соответствует её car, а cdrpat — её cdr.

(list eltpats…)

Соответствует списку, если eltpats соответствуют его элементам. Первый eltpat должен соответствовать первому элементу списка, второй eltpat — второму элементу списка и так далее.

(vector eltpats…)

Соответствует вектору, если eltpats соответствуют его элементам. Первый eltpat должен соответствовать первому элементу вектора, второй eltpat — второму элементу вектора и так далее.

(cdr pattern)

Сопоставляет pattern со строгой проверкой cdr. Это означает, что образцы list проверяют, что последний cdr — это nil. Строгая проверка используется по умолчанию.

(cdr-ignore pattern)

Сопоставляет pattern с нестрогой проверкой cdr. Это означает, что образцы list не проверяют последний cdr.

(and conjuncts…)

Сопоставляет каждый из conjuncts с одними и теми же данными. Если все они соответствуют, этот образец считается успешно сопоставленным. Если один conjunct не соответствует, сопоставление с этим образцом завершается неудачей без проверки остальных conjuncts.

(or disjuncts…)

Сопоставляет каждый из disjuncts с одними и теми же данными. Если один disjunct соответствует, этот образец считается успешно сопоставленным без проверки остальных disjuncts. Если ни один из них не соответствует, сопоставление с этим образцом завершается неудачей.

(cond*-expander …)

Здесь car — это символ, имеющий свойство cond*-expander, определяющее способ его обработки в образце. Значение свойства — функция. Попытка сопоставить такой образец вызывает эту функцию с одним аргументом — рассматриваемым образцом (включая его car). Функция должна вернуть эквивалентный образец для последующего сопоставления.

(predicate symbol)

Соответствует datum, если (predicate datum) истинно, а затем связывает symbol с datum.

(predicate SYMBOL more-args…)

Соответствует datum, если (predicate datum more-args…) истинно, а затем связывает symbol с datum. more-args… может ссылаться на символы, связанные ранее в образце.

(constrain symbol exp)

Соответствует datum, если форма exp истинна. exp может ссылаться на символы, связанные ранее в образце.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/cond_002a-Macro.html

Spec-Zone.ru

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