Условная конструкция с сопоставлением с образцом
Помимо четырёх основных форм условных конструкций, в Emacs Lisp также есть условная конструкция с сопоставлением с образцом — макрос pcase, гибрид cond и cl-case (см. Условные конструкции в Расширениях Common Lisp), который преодолевает их ограничения и вводит стиль программирования с сопоставлением с образцом. Ограничения, которые преодолевает pcase:
- Форма
condвыбирает один из вариантов, вычисляя предикат condition каждого из своих предложений (см. Условные конструкции). Основное ограничение состоит в том, что переменные, связанные с помощью let в condition, недоступны в body-forms предложения.Ещё одно неудобство (скорее затруднение, чем ограничение) заключается в том, что при использовании последовательности предикатов condition для проверки на равенство приходится многократно повторять один и тот же код. (
cl-caseустраняет это неудобство.) - Макрос
cl-caseвыбирает один из вариантов, сравнивая первый аргумент на равенство с набором конкретных значений.У него два ограничения:
- Для проверки на равенство используется
eql. - Значения должны быть заранее известны и указаны явно.
Из-за этого
cl-caseне подходит для строк или составных структур данных (например, списков или векторов). (Уcondэтих ограничений нет, но есть другие; см. выше.) - Для проверки на равенство используется
Концептуально макрос pcase заимствует у cl-case фокус на первом аргументе, а у cond — порядок обработки предложений. Он заменяет condition обобщённой проверкой на равенство, представляющей собой вариант сопоставления с образцом, и добавляет средства, позволяющие кратко выражать предикат предложения и совместно использовать let-связывания между предикатом предложения и body-forms.
Краткое выражение предиката называется образцом. Если предикат, применённый к значению первого аргумента, возвращает не-nil, говорят, что «образец соответствует значению» (или иногда «значение соответствует образцу»).
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/Pattern_002dMatching-Conditional.html