Y Combinator на Python

Y Combinator у функциональных программистов не менее священная корова, нежели монады (которые моноиды в категории эндофункторов), и метациклические интерпретаторы. Сейчас мы посмотрим, что у этой коровы внутри, с помощью лекций американского профессора Matt Might. Начнём,[…]

Читать дальше …

Гимн конкатенативности

предыдущая серия У конкатенативных языков на самом деле огромное количество плюсов! Реализация и оптимизация Конкатенативные языки очень просто и эффективно реализуются на императивных языках. По сути, например и CPython, и JVM, и многие другие движки,[…]

Читать дальше …

путём конкатенативной Силы

практическое продолжение рассуждений по теме Правильный конкатенативный язык будет характеризоваться несколькими достаточно очевидными моментами. 1. Постфиксная нотация 2 2 + Эта форма нотации наиболее естественна, так как отражает реальный порядок формирования (записи) потока данных и[…]

Читать дальше …

Ломаем Python

Как уже отмечалось, узлы AST достаточно сильно зависят от конкретного языка — с одной стороны, но с другой стороны, для тех, кто написал много парсеров, в разных AST выявляется множество стандартных элементов. К сожалению, единого[…]

Читать дальше …

Абстракция абстрактного синтаксического дерева

предыдущая серия Несмотря на все плюсы, сфера применения абстрактного синтаксического дерева всё же серьёзно ограничена. Ведь AST привязано к синтаксису своего родного языка, и универсального стандарта на представление AST не существует. Поэтому работа на уровне[…]

Читать дальше …

Транслируем AST обратно в Python

предыдущая серия Теперь рассмотрим элементарные принципы трансляции AST в некий язык программирования. За счёт большой гибкости Питона мы можем на лету формировать абстрактные деревья произвольной сложности (в том числе и на лету, из своего же[…]

Читать дальше …

AST и Python

предыдущая серия Рассмотрим базовые механизмы манипуляции абстрактным синтаксическим деревом в Python. AST мы сформируем с помощью стандартного модуля ast. Его функция parse() получает на вход текст исходного кода, который надо преобразовать в дерево. В случае,[…]

Читать дальше …

В чём сила AST?

предыдущая серия Итак, в чём же сила абстрактных синтаксических деревьев AST в сравнении с обычным кодом? Во-первых, мы работаем на более высоком уровне абстракции, и в общем случае, вообще не связаны конкретным языком программирования. Во-вторых,[…]

Читать дальше …

Max Power Meta Python

На практике концепция метапрограммирования реализуется пока преимущественно инженерными методами. Например, сам язык может предлагать богатый инструментарий для создания DSL — как например Ruby (хотя в нём создание DSL — это скорее синтаксическая особенность языка, позволяющая[…]

Читать дальше …

Блеск и нищета HoTT

Гомотопическая теория типов Воеводского — это оригинальная попытка взглянуть на «классические» теории типов со стороны топологии. В HoTT тип — это теперь категория с изоморфизмами, тут же подключаются гомотопии, определяющие отношения эквивалентности, и т.д. Примитивно[…]

Читать дальше …

Pattern-matching на питоне

предыдущая серия Какие управляющие структуры используются в императивном программировании? Условный оператор if else, оператор выбора switch, операторы цикла for/foreach с прерываниями break/continue, итеративные операторы цикла while/repeat, ну и конечно goto, который поддерживался например оригинальной JVM[…]

Читать дальше …

Хранители четырёх ключей (2)

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

Читать дальше …

Сердце и дух функционального программирования

Какой бы код мы ни писали, всегда следует придерживаться четырёх простых, но крайне важных правил: — функционально-ориентированно (а не объектно-ориентированно); — функции, а не команды; — алгебраические типы для описания моделей; — паттерн-матчинг для управления[…]

Читать дальше …

Моноиды: заключение (10)

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

Читать дальше …

Превращаем функции в моноид

предыдущая серия В качестве наглядного примера рассмотрим функцию вычисления среднего двух чисел. Это может быть в разных случаях и автономная функция, и объект с соответствующими свойствами и методами. Самое главное, что такая функция не отвечает[…]

Читать дальше …

Нуль для моноида

предыдущая серия Последнее оставшееся требование для моноида — нулевой элемент. В принципе, во многих случаях можно обходиться без него, полугруппами. Но тем не менее, рассмотрим способ формирования нулевого элемента для произвольных объектов. Для чисел и[…]

Читать дальше …

Ассоциативность для не-моноидов

предыдущая серия 2. Ассоциативность С реализацией замыкания для не-моноидов мы разобрались, теперь очередь ассоциативности. Напомню, что не ассоциативны например, операции вычитания или деления. В «мэйнстримовских» функциональных языках программирования данная проблема решается с помощью костылей —[…]

Читать дальше …

Выпускаем моноиды на свободу

предыдущая серия Итак, можно ли любой объект программы превратить в моноид? Давайте пересмотрим три ключевые составляющие моноида. 1. Замыкания Очевидно, что далеко не всегда операция «сложения» даёт тот же тип, что и типы аргументов. И[…]

Читать дальше …

Моноиды без гомоморфизма (5)

предыдущая серия Надо отметить, что ссылаться на эффективность некоего алгоритма в параллельном режиме работы вообще очень любят академические издания. Однако на практике поддержка параллельного режима востребована крайне редко — либо в единичных супермасштабных проектах, где[…]

Читать дальше …