Макрос 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 carpatcdrpat)Соответствует конс-ячейке, если 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