Тетрис из SKIY-комбинаторов

Сделал для андроида комбинаторную игрушечку: https://play.google.com/store/apps/details?id=ru.serge.ski_combinators (бесплатно без рекламы) по мотивам вот этого http://dirk.rave.org/combinatris/how-to-play.html У оригинальной веб-версии недостаток, что не сохраняется игра прежде всего, ну и нету никаких потенциальных возможностей, которые наличествуют в гугль плее.[…]

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

Проектируем мета-язык для полных идиотов

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

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

РеFUNкторинг, генерики и HOF

Рассмотрим простой пример на C#. Допустим, на вход подаётся список чисел, и мы должны вернуть список строк, каждая из которых — это исходное число, увеличенное на единичку, с префиксом «N «.   Соответствующую функцию можно[…]

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

Комбинируем безсерверные комбинаторы

Безсерверная (serverless) архитектура — весьма парадоксальная на первый взгляд концепция, если судить по названию. Что имеется в виду под «без серверов»? На самом деле под serverless понимается не физическое отсутствие серверов, а полное от них[…]

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

Игра-симулятор тим-лида

Институт программной инженерии Software Engineering Institute (SEI) при университете Карнеги-Меллона — это некоммерческая научная структура, организованная министерством обороны США для помощи в реализации сверхсложных программных проектов. Одно из ведущих направлении работы SEI — это так[…]

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

Программируем по-литературному

предыдущая серия В качестве простейшего, но очень наглядного примера применения литературного программирования (ЛП) возьмём скрипт noweb.py автора Jon Aquino (на гитхабе). Этот скрипт берёт исходный текстовый файл, размеченный в формате markdown, который содержит код программы,[…]

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

Свободное метапрограммирование

предыдущая серия Но в чем же все таки эксклюзивная особенность литературного программирования (LP)? Ну вот пишем мы подробные комментарии к каждой логической части кода, и что? Почему такой подход вносит некие качественные изменения в процесс[…]

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

LP, BDD, AOP и другие

Литературное программирование (literate programming, LP), оказывается, столь интересная и, в частности, противоречивая концепция, что ее нельзя выразить неким формальным описанием. Проблемы начинаются уже с названия: по-русски корректным будет называть LP как «литературное», так и «грамотное»[…]

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

Теория типов и игровой фреймворк (4)

предыдущая серия — В общем случае, взаимодействия объектов концептуально могут быть не только логические/вычислительные, но также пространственные и временные. Чтобы наполнить флягу из крана, мы должны быть «рядом» с краном. Если мы хотим ее разбить[…]

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

Система типов и Dwarf Fortress (3)

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

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

Система типов и Чужие (2)

начало Таким образом, даже игры класса ААА с многомиллионными бюджетами лишены реальной свободы и творческого поиска. Игровой процесс практически всегда жёстко ограничивается гейм-дизайнером, а игрок в лучшем случае может долго бродить по огромному миру, никак[…]

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

Система типов и Чужие

Alien: Isolation. Станция Севестополь. Мы долго блуждаем по мрачным коридорам, изучаем терминалы и бортовые журналы, и через несколько часов игры наконец встречаем первого Чужого. Точнее, первый намёк на него. Вообще, в целом идея довольно оригинальна:[…]

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

Экстремистское программирование

Термин «экстремистское программирование» предложил в 2012 г. студент Стэнфорда Edward Yang, однако если порыться в сети, окажется, что первые упоминания такой концепции приходятся ещё на 2001-й. Американский профессор Eugene Wallingford упоминал экстремизм ещё в контексте[…]

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

Проектируем API по TDD, разрывая шаблон

Проектируем API с помощью статической типизации и функционального программирования. Допустим, у нас есть задача написать API для игры в шахматы по сети (через интернет). Такая своеобразная MMO, а точнее, онлайновый сервис с поддержкой PvP, а[…]

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

PEG-парсинг на JS и Python

предыдущая серия Использование версии OMeta для веба (точнее, в JavaScript) ещё проще, нежели в случае C#. Достаточно скачать дистрибутив с github.com/alexwarth/ometa-js/ , задеплоить его в свой проект, и настроить пути к скриптам. Вот базовый шаблон[…]

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

Интерпретируем и компилируем с OMeta

предыдущая серия Чтобы вместо интерпретатора, который вычисляет значение правила на лету, спроектировать компилятор, достаточно всего лишь изменить результат парсинга правила, благо OMeta позволяет сделать это единообразным способом. В частности, достаточно всего лишь возвращать не значение,[…]

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

Интерпретатор арифметики на OMeta

предыдущая серия Расширение грамматики семантикой также достаточно просто. Правила разбора, которые надо наполнить семантическим содержанием, дополняются конструкцией «-> {выражение}», и значение этого выражения и будет по сути возвращаться исполнительной системой. Таким образом, наш язык интерпретации[…]

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

OMeta: нисходящий рекурсивный парсер с откатами

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

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

OMeta: Парсер Чего Угодно

начало темы Главная фича метапрограммирования с инженерной точки зрения — это возможность быстрого создания «тематических» языков программирования под конкретную предметную область (DSL), и программирование нужной логики уже на них. Собственно, множество фреймворков эту идею в[…]

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

Конкатенативный стиль программирования

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

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