Я программирую на Racket и Scheme и живу в той части экосистемы Lisp, мимо которой обычно проходят разработчики привычного бэкенда: я конструирую сами языки, а не только применяю чужие. Если задача раз за разом уродует код общего назначения и требует всё новых костылей, часто разумнее ввести собственный компактный предметный язык под её логику — и как раз это я придумываю и собираю. Я делаю опрятные, продуманно разбитые на части функциональные программы, гигиенические макросы, свои ридеры и вычислители, а вместе с ними и обвязку, которая превращает сырой замысел в живой интерпретатор с предсказуемым поведением.
Задачи ко мне приходят примерно трёх видов. Первый — DSL и макросистемы: языково-ориентированные средства Racket позволяют дать команде запись, подогнанную под предметную область, с контролем синтаксиса, внятной диагностикой ошибок и ридером, который воспринимается как встроенный, а не приделанный сверху. Второй — интерпретаторы и компактные компиляторы: разбор входа, вычислители, обход синтаксических деревьев и байткод-бэкенды для конфигурационных форматов, механизмов правил, скриптовых прослоек и опытных языков. Третий — материалы для обучения и исследований: мне близки программы, которые объясняют себя сами, поэтому я собираю визуализаторы, пошаговые трассировщики, автопроверку заданий и интерактивные пособия для тех, кто входит в функциональное программирование и разбирается с лямбда-исчислением под ним.
Корни у меня в семействе Lisp, а не в массовом бэкенде и не в Clojure, поэтому мне дороги надёжность и максимально худое ядро. Я держусь на контрактах, тестировании по свойствам и мелких сцепляемых функциях, а грамматику и инварианты фиксирую в документации, чтобы следующему человеку не пришлось раскапывать ваш парсер вслепую. Дадите полусобранный прототип, залежь макросов, к которой боятся подступиться, или новую задумку крохотного языка — доведу от эскиза до устойчивого рабочего решения.
— Предметные языки и гигиенические макросы на Racket
— Интерпретаторы, вычислители и компактные компиляторы на Scheme
— Разбор входа, свои ридеры и механизмы правил
— Обучающая оснастка: трассировщики, визуализаторы, автопроверка заданий
— Функциональный рефакторинг, контракты и тесты по свойствам
— Перенос и обновление устаревшего кода на Scheme и Lisp
Задачи ко мне приходят примерно трёх видов. Первый — DSL и макросистемы: языково-ориентированные средства Racket позволяют дать команде запись, подогнанную под предметную область, с контролем синтаксиса, внятной диагностикой ошибок и ридером, который воспринимается как встроенный, а не приделанный сверху. Второй — интерпретаторы и компактные компиляторы: разбор входа, вычислители, обход синтаксических деревьев и байткод-бэкенды для конфигурационных форматов, механизмов правил, скриптовых прослоек и опытных языков. Третий — материалы для обучения и исследований: мне близки программы, которые объясняют себя сами, поэтому я собираю визуализаторы, пошаговые трассировщики, автопроверку заданий и интерактивные пособия для тех, кто входит в функциональное программирование и разбирается с лямбда-исчислением под ним.
Корни у меня в семействе Lisp, а не в массовом бэкенде и не в Clojure, поэтому мне дороги надёжность и максимально худое ядро. Я держусь на контрактах, тестировании по свойствам и мелких сцепляемых функциях, а грамматику и инварианты фиксирую в документации, чтобы следующему человеку не пришлось раскапывать ваш парсер вслепую. Дадите полусобранный прототип, залежь макросов, к которой боятся подступиться, или новую задумку крохотного языка — доведу от эскиза до устойчивого рабочего решения.
— Предметные языки и гигиенические макросы на Racket
— Интерпретаторы, вычислители и компактные компиляторы на Scheme
— Разбор входа, свои ридеры и механизмы правил
— Обучающая оснастка: трассировщики, визуализаторы, автопроверка заданий
— Функциональный рефакторинг, контракты и тесты по свойствам
— Перенос и обновление устаревшего кода на Scheme и Lisp