Металингвистический совратитель Си. Опус II: Рекуррентный экстаз

Лучшие публикации за сутки.

>> Осторожно, модерн! 2 — 0.2. Пропажа заначки

Год назад, в 15 лет, меня озадачила проблема compile-time имитации алгебраических типов данных в чистом Си. Для этого я создал poica — исследовательский язык на макросах. Серия этих опусов — логическое продолжение моего исследования.

Предисловие

Макросистема Си являет собой аналог перезаписи термов из одной известной Тьюринг-полной функциональной модели вычислений — лямбда-исчисления. Имея в арсенале эту невыносимо простую концепцию, можно, казалось бы, одними макросами описать совершенно любой алгоритм, поддающийся описанию в большинстве языков программирования!

Но есть одно "но": блокировка рекурсии (macro blueprinting), зашитая прямо в стандартном препроцессоре — именно она препятствует манипулированию коллекциями произвольной длины, вычислению функции Аккермана и многим другим вещам; даже Y комбинатор не в силах помочь ввиду непервоклассной природы макросов.

Но это нас не остановит! Не можешь решить задачу целиком — реши её частично. Сей опус посвящён механизму обобщённой макрорекурсии в стиле передачи продолжений на отложенных макрораскрытиях.

Цель — сгенерировать Cons-список:

$ ((((((((((0), 1), 2), 3), 4), 5), 6), 7), 8), 9) $

Для этого нам предстоит протаранить скважину в продвинутое функциональное программирование… но хватит уже лохматить бабушку, скорее под кат!

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

Добавить комментарий

Ваш адрес email не будет опубликован.