Расширение pcase
Макрос pcase поддерживает несколько типов шаблонов (см. Сопоставление с шаблонами - условное). Вы можете добавить поддержку других типов шаблонов, используя макрос pcase-defmacro.
- Макрос: pcase-defmacro name args [doc] &rest body
-
Определить новый тип шаблона для
pcase, который вызывается как(name actual-args). Макросpcaseрасширяет это в вызов функции, который оценивает body, задача которого – переписать вызванный шаблон в другой шаблон в среде, где args связаны с actual-args.Кроме того, организовать отображение doc вместе со строкой документации
pcase. По соглашению, doc должен использоватьEXPVALдля обозначения результата оценки expression (первый аргумент дляpcase) .
Как правило, body переписывает вызванный шаблон, используя более базовые шаблоны. Хотя все шаблоны в конечном итоге сводятся к базовым шаблонам, body не обязательно должны использовать базовые шаблоны сразу. Следующий пример определяет два шаблона с именами less-than и integer-less-than.
(pcase-defmacro less-than (n) "Matches if EXPVAL is a number less than N." `(pred (> ,n)))
(pcase-defmacro integer-less-than (n)
"Matches if EXPVAL is an integer less than N."
`(and (pred integerp)
(less-than ,n)))
Обратите внимание, что строки документации упоминают args (в данном случае только один: n) обычным способом, а также упоминают EXPVAL по соглашению. Первая переработка (т. е., body для less-than) использует один базовый шаблон: pred. Вторая использует два базовых шаблона: and и pred, а также недавно определенный шаблон less-than. Оба используют один конструктор обратной кавычки (см. Обратная кавычка).
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/Extending-pcase.html