Категория: Бланки/Образцы
В языках программирования сопоставление с образцом ( англ. Pattern matching ) — метод анализа и обработки структур данных, основанный на выполнении определённых инструкций в зависимости от совпадения исследуемого значения с тем или иным образцом, в качестве которого может использоваться константа, предикат, тип данных или иная поддерживаемая языком конструкция.
Как правило, имеется возможность указать более одного образца и связанного с ним действия.
Сопоставление с образцом часто встречается в функциональных языках программирования. таких как языки семейства ML и Haskell. Императивные языки иногда тоже умеют сопоставлять с образцом. А регулярные выражения для символов, являясь случаем соспоставления с образцом, поддержаны везде.
Сравнение с точным значениемПростейшим вариантом является сопоставление с константой. В этом случае сопоставление с образцом эквивалентно условному оператору или конструкции «switch» («case») в императивных языках.
Здесь следующие за символом "|" значения являются образцами, а следующие за «->» выражения вычисляются при совпадении аргумента «x» с одним из образцов.
Тот же пример с использованием условного оператора :
Использование внутренней структуры объектаНахождение суммы списка:
В этом примере аргумент функции «sum» сопоставляется со значением «пустой список», либо с образцом «голова . хвост» (где «::» — оператор добавления элемента в начало списка).
Алгебраические типы данныхВ качестве образца может применяться конструктор типов :
Сопоставление со строкойЯзыки с развитой поддержкой обработки текста, такие как AWK и SNOBOL. поддерживают сопоставление с регулярным выражением .
Пример на AWK, подсчет количества включений слов «foo» или «bar»:
сопоставление с образцом — palyginimas su pavyzdziu statusas T sritis automatika atitikmenys: angl. pattern matching vok. Vergleich mit dem Muster, m rus. сопоставление с образцом, n; сравнение с эталоном, n pranc. concordance par exemple, f … Automatikos terminu zodynas
С++ — См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп … Википедия
сравнение с эталоном — palyginimas su pavyzdziu statusas T sritis automatika atitikmenys: angl. pattern matching vok. Vergleich mit dem Muster, m rus. сопоставление с образцом, n; сравнение с эталоном, n pranc. concordance par exemple, f … Automatikos terminu zodynas
Пушкин А. С. — Пушкин А. С. Пушкин. Пушкин в истории русской литературы. Пушкиноведение. Библиография. ПУШКИН Александр Сергеевич (1799 1837) величайший русский поэт. Р. 6 июня (по ст. стилю 26 мая) 1799. Семья П. происходила из постепенно обедневшего старого… … Литературная энциклопедия
Pattern matching — Сопоставление с образцом, отождествление … Краткий толковый словарь по полиграфии
Nemerle — Семантика: мультипарадигменный, объектно ориентированный, функциональный, императивный Тип исполнения: компилируемый Появился в: 0.9.3 16 мая … Википедия
Алгоритм Rete — Rete[1] эффективный алгоритм сопоставления с образцом для продукционных систем, экспертных систем и баз знаний, созданный Чарльзом Форги из Университета Карнеги Меллона. Впервые был описан в рабочем документе 1974 года, затем в докторской… … Википедия
Сравнение языков программирования — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Условные обозначения … Википедия
Scala (язык программирования) — У этого термина существуют и другие значения, см. Scala. Scala Класс языка: Мультипарадигмальный: функ … Википедия
Macsyma — Эта статья содержит незавершённый перевод с английского языка. Вы можете помочь проекту, переведя её до конца. Macsyma система компьютерной алгебры, первая версия ко … Википедия
В языках программирования сопоставление с образцом (англ. Pattern matching ) — метод анализа и обработки структур данных, основанный на выполнении определённых инструкций в зависимости от совпадения исследуемого значения с тем или иным образцом, в качестве которого может использоваться константа, предикат, тип данных или иная поддерживаемая языком конструкция.
Как правило, имеется возможность указать более одного образца и связанного с ним действия.
Сопоставление с образцом часто встречается в функциональных языках программирования. таких как языки семейства ML и Haskell. Императивные языки иногда тоже умеют сопоставлять с образцом. А регулярные выражения для символов, являясь случаем соспоставления с образцом, поддержаны везде.
Содержание Сравнение с точным значением [ править ]Простейшим вариантом является сопоставление с константой. В этом случае сопоставление с образцом эквивалентно условному оператору или конструкции «switch» («case») в императивных языках.
Рассмотрим, для примера, вычисление логического отрицания.
В Ocaml. <source lang="ocaml"> let neg x =
</source> Здесь следующие за символом "|" значения являются образцами, а следующие за «->» выражения вычисляются при совпадении аргумента «x» с одним из образцов.
Тот же пример с использованием условного оператора. <source lang="ocaml"> let neg x =
Использование внутренней структуры объекта [ править ]Нахождение суммы списка: <source lang="ocaml"> let rec sum l =
</source> В этом примере аргумент функции «sum» сопоставляется со значением «пустой список», либо с образцом «голова . хвост» (где «::» — оператор добавления элемента в начало списка).
Алгебраические типы данных [ править ]В качестве образца может применяться конструктор типов.
<source lang="ocaml"> type animal = Dog of string | Cat of string ;;
Сопоставление со строкой [ править ]Языки с развитой поддержкой обработки текста, такие как AWK и SNOBOL. поддерживают сопоставление с регулярным выражением.
Пример на AWK, подсчет количества включений слов «foo» или «bar»: <source lang="awk"> /foo|bar/ < foobar++ >
См. также [ править ]В функциональных языках есть интересная возможность, фактически являющаяся расширением идеи перегрузки функций - сопоставление с образцом. Для этого поддерживается специальный синтаксис шаблонов структур данных, позволяющий проверить что объект имеет определенный тип и/или поля, а также извлечь из него некоторые данные. Пример из haskell (частично взято тут wiki ):
Примерно тоже можно сделать во многих функциональных языках, но я никогда не видел подобных возможностей в императивных языках. Самое близкое что есть по интеллектуальности - перегрузка функций в C++. Такое положение связанно и с особенностями задач, обычно решаемыми в функциональных языках, и с их ориентированностью на рекурсивные структуры данных и с попытками уйти от if и других императивных особенностей.
Но тем не менее желание сделать что-то подобное для python возникало после каждого ковыряния в функциональщине и после каждой конструкции вида:
А тут что-то захотелось посмотреть внимательно на модуль ast (abstract syntax tree ) - давно не использовал его, последний раз еще во времена 2.4 - тогда очень жалел, что он не позволяет компилировать измененный ast (кстати делал интересный проект по портированию большого куска кода с PyQt3 на PyQt4 и ast позволил значительно автоматизировать этот перенос).
ast позволяет получить из python кода его результат после синтаксического разбора, но еще до компиляции в байтокод, исследовать его и/или изменять и компилировать новый вариант. Пример ast:
Фактически мы получаем исходный текст в удобном для ковыряния виде (правда несколько громоздком). Именно с абстрактными синтаксически деревьями работаю всяческие анализаторы кода, оптимизаторы и прочее. ast предоставляет некоторое количество вспомогательных функций и два класса - NodeVisitor для просмотра ast и NodeTransformer для модификации.
На этом все про ast. Что хотелось от сопоставления с образцом:
После некоторого времени размышлений остановился на таком варианте:
Как это должно было-бы работать:
Совсем так, как хотелось, сразу не вышло. Вышло так:
Из необязательных ограничений - нужно импортировать модуль python_match без переименования. Обернуть все функции, где используется сопоставление с образцом, декоратором 'python_match.mathing '.
Как это работает:
Осталось некоторое количество ограничений, которые однако не принципиальные, так что поскольку задача скорее стояла из разряда - "как бы это сделать" я не стал заниматься дальнейшими оптимизациями/улучшениями.
Исходники этого и других постов со скриптами лежат тут - github.com/koder-ua. При использовании их, пожалуйста, ссылайтесь на koder-ua.blogspot.com .
В языках программирования сопоставление с образцом (англ. Pattern matching ) — метод анализа и обработки структур данных, основанный на выполнении определённых инструкций в зависимости от совпадения исследуемого значения с тем или иным образцом, в качестве которого может использоваться константа, предикат, тип данных или иная поддерживаемая языком конструкция.
Как правило, имеется возможность указать более одного образца и связанного с ним действия.
СодержаниеСравнение с точным значением
Простейшим вариантом является сопоставление с константой. В этом случае сопоставление с образцом эквивалентно условному оператору или конструкции «switch» («case») в императивных языках.
Здесь следующие за символом "|" значения являются образцами, а следующие за «->» выражения вычисляются при совпадении аргумента «x» с одним из образцов.
Использование внутренней структуры объекта
Нахождение суммы списка:
В этом примере аргумент функции «sum» сопоставляется со значением «пустой список», либо с образцом «голова. хвост» (где «::» — оператор добавления элемента в начало списка).
Алгебраические типы данных
Сопоставление со строкой
Пример на AWK, подсчет количества включений слов «foo» или «bar»: