Spec-Zone.ru › Elisp

Деструктуризация с образцами pcase

Образцы pcase не только выражают условие относительно формы объектов, с которыми они могут совпадать, но и могут извлекать подполя этих объектов. Например, мы можем извлечь 2 элемента из списка, являющегося значением переменной my-list с помощью следующего кода:

  (pcase my-list
    (`(add ,x ,y)  (message "Contains %S and %S" x y)))

Это не только извлечет x и y, но также проверит, что my-list является списком, содержащим ровно 3 элемента, и первым элементом которого является символ add. Если любой из этих проверок не пройдёт, pcase немедленно вернёт nil без вызова message.

Извлечение нескольких значений, хранящихся в объекте, называется деструктуризацией. Использование образцов pcase позволяет выполнять связывание через деструктуризацию, что аналогично локальному связыванию (см. Локальные переменные), но присваивает значения нескольким элементам переменной, извлекая эти значения из объекта с совместимой структурой.

Макросы, описанные в этом разделе, используют образцы pcase для выполнения связывания через деструктуризацию. Условие о совместимой структуре объекта означает, что объект должен соответствовать образцу, поскольку только тогда можно извлечь подполя объекта. Например:

  (pcase-let ((`(add ,x ,y) my-list))
    (message "Contains %S and %S" x y))

делает то же самое, что и предыдущий пример, за исключением того, что он напрямую пытается извлечь x и y из my-list без предварительной проверки, является ли my-list списком с правильным числом элементов и имеет ли add в качестве первого элемента. Точное поведение, когда объект фактически не соответствует образцу, не определено, хотя тело не будет пропущено безмолвно: либо сигнализируется ошибка, либо тело выполняется с некоторыми переменными, потенциально связанными с произвольными значениями, такими как nil.

Образцы pcase, полезные для связывания через деструктуризацию, как правило, описаны в Образцы с обратными кавычками, поскольку они выражают описание структуры объектов, которые будут совпадать.

Для альтернативного механизма связывания через деструктуризацию см. seq-let.

Макрос: pcase-let связывания тело…

Выполнить связывание переменных через деструктуризацию в соответствии со связываниями и затем оценить тело.

связывания — это список связываний вида (pattern exp), где выражение — это выражение для оценки, а образец — образец pcase.

Все выражения оцениваются сначала, после чего они сопоставляются со своими соответствующими образцами, вводя новые связывания переменных, которые затем могут быть использованы внутри тела. Связывания переменных производятся путем связывания элементов образца со значениями соответствующих элементов оценённого выражения.

Макрос: pcase-let* связывания тело…

Выполнить связывание переменных через деструктуризацию в соответствии со связываниями и затем оценить тело.

связывания — это список связываний вида (pattern exp), где выражение — это выражение для оценки, а образец — образец pcase. Связывания переменных производятся путем связывания элементов образца со значениями соответствующих элементов оценённого выражения.

В отличие от pcase-let, но аналогично let*, каждое выражение сопоставляется со своим соответствующим образцом перед обработкой следующего элемента связываний, поэтому связывания переменных, введённые в каждом из связываний, доступны в выражениях связываний, которые следуют за ним, помимо того, что они доступны в теле.

Макрос: pcase-dolist (образец список) тело…

Выполнить тело один раз для каждого элемента списка, на каждой итерации выполняя связывание переменных в образце со значениями соответствующих подполей элемента списка. Связывания выполняются так, как если бы они выполнялись с помощью pcase-let. Когда образец является простой переменной, это оказывается эквивалентно dolist (см. Итерация).

Макрос: pcase-setq образец значение…

Присвоить значения переменным в форме setq, деструктурируя каждое значение в соответствии с его соответствующим образцом.

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/Destructuring-with-pcase-Patterns.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API