Владимир Галкин (vladgalkin) wrote in ru_programming,
Владимир Галкин
vladgalkin
ru_programming

Category:

Nemerle

But magic, true magic, is worked only by those beings who speak the Hardic tongue of Earthsea, or the Old Speech from which it grew.
from A Wizard of Earthsea by U.K. Le Guin


Есть такой замечательный язык программирования для .NET - Nemerle, ныне широко обсуждаемый в форуме Философия Программирования на RSDN. Этот язык дал мне то, что следует выделить огромными жирными буквами -  СМЕНУ ПАРАДИГМЫ. Я пробовал Python, я пробовал Ruby, но дал мне её Nemerle. Этот язык промыл мне мозги, совратил меня функциональным программированием и  другими фичами. Данный язык без зазрения совести можно называть: "C# 4.0 сегодня" или как более скромно говорят сами разработчики Nemerle (польский профессор и несколько студентов): "Semantically Nemerle is mostly a C# superset."  Nemerle органично впитал в себя концепции из множества языков (C#, Python, Ruby, Lisp, Scheme, ML, Haskell, Eiffel, Chrome, Spec#, Polyphonic C# etc.)

В Nemerle очень сильно рулит вывод типов, лямбда-исчисление etc. а также отсутствует оверхед в написании слова new при создании экземпляров классов.

Но самая главная вкусность Nemerle, это его макросы, нет это не просто тупая подстановка кусков текста как в C/C++, это:
"system of compile-time transformations and automatic generation of code with regard to some rules. It can be used either to automate manipulations performed on similar data-types and fragments of code or to add syntax shortcuts to the language, optimize and make some computations safer by moving them from runtime to compile-time"  т.е. макросы дают нам возможность compile-time генерации кода, являясь "стволом" всего языка, даже в самом компиляторе Nemerle такие императивные конструкции как if..else, циклы for и while и даже операторы  вроде && определены с помощью макросов, расширяющих синтаксис языка, основная конструкция в Nemerle - pattern matching, вот пример из исходников компилятора Nemerle:
macro @if (cond, e1, e2)
syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)
{
   <[
          match ($cond)
          {
                | true =>    $e1
                | _     =>    $e2
          } 
    ]>
}

И это ещё цветочки...С помощью макросов в Nemerle можно легко встроить поддержку DSL (что, собственно, уже сделано с SQL) или даже построить свой небольшой DSL, используя Raw Token Extensions.

Nemerle предотвращает конфликт имен между макросами и plain-code ("гигиену"  - по аналогии с Lisp и Scheme), помещая идентификаторы созданые макросом в уникальное пространство имен, но как в любом нормальном языке, позволено контролируемое нарушение этого правила.

Об отличиях Nemerle от С# можно прочитать здесь. Основными засадами для меня было: что в конструкции if..else, else является обязательным (Nemerle определяет специальные конструкции when и unless - if без else и if без then, соответственно); то, что такие конструкции рассматриваются как функции и следовательно, тип выражения в ветке if должен совпадать с таковым в ветке else, а также то, что тип  оператора присвоения - void и поэтому нельзя писать так: expr_1 = expr_2 = expr_3; Концепция void литерала хорошо развита в Nemerle, в связи с поддержкой парадигмы функционального программирования.

Пока основная сложность языка, это отсутствие поддержки нормальной IDE, однако это не препятствие для настоящих романтиков ж)
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 318 comments