Условный оператор с шаблонами сопоставления
Помимо четырёх основных форм условных операторов, в 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, мы говорим, что «шаблон соответствует значению» (или иногда «значение соответствует шаблону»).
• Макрос pcase |
Включает примеры и замечания. | |
• Расширение pcase |
Определение новых типов шаблонов. | |
| • Шаблоны в стиле backquote | Структурное сопоставление шаблонов. | |
| • Распаковка с шаблонами pcase | Использование шаблонов pcase для извлечения подполей. |
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/Pattern_002dMatching-Conditional.html