Nemerle — язык под .NET, который поддерживает три парадигмы программирования: та, которую большинство программистов считает за ООП парадигму, функциональную парадигму (алгебраические типы данных, pattern-matching) и метапрограммирование (АОП, квазицитирование, расширение синтаксиса самого nemerle через макросы a-la lisp ). Все это положено на рельсы строгой статической типизации и приправлено мощной системой вывода типов.


В единое целое это объединено следующим образом: структуру программы задают классы, то есть внешне код похож на старый добрый C#, но за жизнь внутри метода отвечает ФП. Метапрограммирование заметить сложно — оно может быть замаскировано под атрибут у класса или «стандартную» конструкцию while, которая на самом деле является макросом, который при компиляции макроса разворачивается в хвостовую рекурсию, которая уже в свою очередь преобразуется в цикл на IL компилятором «чистого» nemerle. Говорю чистого, так как почти все управляющие команды в nemerle, такие как if, when, unless, while, for реализованы в виде макросов. Таким образом можно писать код на nemerle, не знать ничего про метапрограммирование, но во всю его использовать и не подозревать об этом. Кратко, если вы ничего не слышали о нем, то это не помешает вам кодить на nemerle. Это так же касается и ФП — вам никто не мешает использовать функции с side effects. Но даже если начать писать код на nemerle, как будто это C# и забить на мету, ФП, то можно приятно удивиться — nemerle поддерживает кортежи, параметры по умолчанию и заменяет делегаты на функциональные типы, то есть решает проблему совместимости делегатов с одинаковой сигнатурой — вместо Func<int,int> достаточно писать только сигнатуру, например, int->int.

Это я узнал из статей на RSDN, блогов и документации, но всегда сам хотел попробовать пописать на nemerle. К сожалению я не сделал этого раньше по разным причинам — либо работал с людьми, которые не разделяли моей точки зрения, на то, каким должен быть удобный язык программирования, либо боялся начать большой проект на новом языке; но честно говоря было просто лень. Пару дней назад меня подкосил грипп и я решил осуществить мечту — писать на nemerle. Подопытным кроликом стал мой долгоиграющий проект на шарпе, который является моим хобби уже на протяжении нескольких месяцев. Может когда-нибудь я напишу о нем на хабре, но пока без подробностей: одна из основных функций разбор выражений и работа с деревьями, представляющих эти выражения. Эту часть было легко покрыть тестами, поэтому я придерживался TDD при разработке, в итоге на 71 файл у меня был 73 теста. Такое полное покрытие тестами придало мне уверенности и я решился на такой рефакторинг, как смена языка. За три дня я полностью переписал код на nemerle это расширило мои представление о нем.

Мне язык показался очень удобным, так как там, где я не хотел переписывать код в стиле nemerle я выключал мозг и занимался механическим переносом кода с шарпа на nemerle, но там, где я считал разумным использовать ФП стиль я его использовал, и это помогло сократить размер проекта до 38 файлов. Такого результата я смог достичь благодаря тому, что использовал ФП там, где его место, а именно разбор выражений и работа с деревьями: дерево в функциональных языка естественно представлять как алгебраический тип данных, что значительно упрощает работу с ним. После моего знакомства с nemerle, я пересмотрел список своих любимых универсальных языков программирования, теперь первое место занимает nemerle как представитель статической типизации и xotcl, который представляет динамический отряд.

Этой статьей я хотел лишний раз напомнить о том, что тестирование это круто, и обратить внимание хабрасообщества на nemerle.

Ниже небольшой коллаж, который отражает уровень интеграции nemerle и MS VS 2008, а так же синтаксис языка.