В начале октября я взял на себя обязательство изучить за месяц язык Лисп, и в целом выполнил его раньше срока. К концу месяца я достаточно свободно читал программы на Лиспе, и писал что-то пусть простое, но не вполне тривиальное с точки зрения языка (в первый раз, когда у меня окончательно отладился и заработал небольшой набор макросов, использующих другие макросы и в целом выполняющих свою работу сквозь 2-3 степени вложения/разложения обратными кавычками и запятыми, на душу снизошел покой).
Теперь мне хочется написать что-то нетривиальное на Лиспе (Common Lisp'е, если быть точным), чтобы немного закрепить изученное, и я решил в свободное время -- которого и так, конечно, очень мало -- написать парсер языка Perl6, т.е. новой, находящейся сейчас в разработке версии Перла. Это достаточно глупая затея, потому что очень хороший парсер, да и интерпретатор, да и значительная часть компилятора уже есть, в рамках проекта Pugs, написанного частично на Хаскеле, частично уже на Perl6; чтобы следить за этим проектом и в чем-то в нем участвовать, я в начале этого года изучил Хаскель и участвовал в хакатоне на эту тему. Но тем не менее, так вот захотелось. Посмотрим, что из этого выйдет, и выйдет ли что-нибудь.
На самом деле я пишу эту запись, чтобы зарегистрировать забавное ощущение, с которым я и прежде был знаком, но не в столь очищенной форме. То, что я хочу сделать - не такая уж простая задача, потому что Perl6 - язык, позволяющий динамически менять не только значения своих операторов (как operator overloading в C++), но и вообще почти всю структуру языка, включая ключевые слова и как они работают, включая введение новых операторов и мета-операторов в язык, и многое другое. При этом эти новые операторы или макросы (похожие по своему действию на макросы Лиспа, т.е. несравнимо более мощные, чем макросы таких языков, как C/C++) могут вводится динамически, их действие может быть лексически ограничено блоком кода, итд. итп. Где-то три дня назад я закончил простенький, но достаточно мощный parser generator для рекурсивных top-down parsers (этого вполне достаточно в данном случае), и казалось бы, сиди и выписывай правила. Но последние три дня получилось так, что я не написал ни строчки кода (причем я как бы все время порывался начать, но что-то все время меня останавливало, очередная навязчивая мысль), а вместо этого думал и передумывал то, как это в принципе должно быть устроено, перечитывал spec итд. И по мере того, как я об этом думал, у меня в голове постепенно все пере-укладывалось в гораздо более стройную картину, всякие вещи, которые я сначала думал, что будут сложными специальными случаями, оказались частными случаями общего принципа, всякие отдельные правила, которые я собирался выписывать, оказались уже готовыми, если я сделаю другую общую вещь, итд. итп. В подробности нет смысла вдаваться, но общее ощущение было такое - я не написал ни строчки, но объем работы, который мне предстоит, уменьшился где-то раза в три, не говоря уж о том, что все очень прояснилось. Очень забавное (и приятное) ощущение.