pcaseМакрос pcase поддерживает несколько видов шаблонов
(см. Условная конструкция с сопоставлением с образцом).
Вы можете добавить поддержку других видов шаблонов
с помощью макроса pcase-defmacro.
Определяет новый вид шаблона для 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) "Соответствует, если EXPVAL — число меньше N." `(pred (> ,n)))
(pcase-defmacro integer-less-than (n)
"Соответствует, если EXPVAL — целое число меньше N."
`(and (pred integerp)
(less-than ,n)))
Обратите внимание, что строки документации упоминают args
(в данном случае только один: n) обычным образом,
а также упоминают EXPVAL по соглашению.
Первое переписывание (т.е. body для less-than)
использует один базовый шаблон: pred.
Второе использует два базовых шаблона: and и pred,
а также только что определённый шаблон less-than.
Оба используют одну конструкцию с обратным апострофом (см. Обратный апостроф).