11.4.2 Расширение 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)
  "Соответствует, если 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. Оба используют одну конструкцию с обратным апострофом (см. Обратный апостроф).