Nemerle - Nemerle

Nemerle
ПарадигмаМультипарадигма: функциональный, императив, мета, объектно-ориентированный
РазработаноКамил Скальски, Михал Москаль, Проф. Лешек Пахольски, Павел Ольшта в Вроцлавский университет
РазработчикJetBrains
Впервые появился2003; 17 лет назад (2003)
Стабильный выпуск
1.2.507.0[1] / 6 августа 2016 г.; 4 года назад (2016-08-06)
Печатная дисциплинаПредполагаемый, номинальный, статический, сильный
ПлатформаCLI
Расширения имени файла.n
Интернет сайтнемерле.org
Основной реализации
Nemerle
Под влиянием
C #, Лисп, ML

Nemerle это общее назначение, высокий уровень, статически типизированный язык программирования разработан для платформ, использующих Инфраструктура общего языка (.СЕТЬ /Мононуклеоз ). Это предлагает функциональный, объектно-ориентированный и императив Особенности. Имеет простой C # -подобный синтаксис и мощный метапрограммирование система. В июне 2012 года основные разработчики Nemerle были наняты Чешский программного обеспечения девелоперская компания JetBrains. Команда сосредоточена на разработке Nitra, фреймворка для реализации существующих и новых языков программирования. Эта структура, вероятно, будет использоваться для создания будущих версий Nemerle.[2][3][4]

Немерле назван в честь верховного мага Неммерле, персонажа фантастического романа. Волшебник Земноморья к Урсула К. Ле Гуин.

Функции

Наиболее примечательной особенностью Nemerle является возможность смешивать стили программирования, которые объектно-ориентированный и функциональный. Программы могут быть структурированы с использованием объектно-ориентированных концепций, таких как классы и пространства имен, в то время как методы могут (необязательно) быть написаны в функциональном стиле. Другие примечательные особенности включают:

Система метапрограммирования позволяет компилятор расширяемость, встраивание предметно-ориентированные языки, частичная оценка, и аспектно-ориентированное программирование, принимая высокий уровень подход, позволяющий максимально снизить нагрузку на программистов. В языке сочетаются все Инфраструктура общего языка (CLI) стандартные функции, включая параметрический полиморфизм, лямбды, методы расширения и т.д. Доступ к библиотекам, включенным в платформы .NET или Mono, так же прост, как и в C #.

Вывод типа

def Икс = 1;           // intdef мой список = Список(); // общий List [T], тип T выводится из использования в следующей строкемой список.Добавлять(Икс);       // компилятор выводит тип T как int, делая тип myList List [int]

Все является выражением

def Икс =  { // аналогично x = 3    def у = 1;    def z = 2;    у + z   // этот последний оператор является возвращаемым значением блока  };def Икс =  если (DateTime.Сейчас же.День недели == День недели.понедельник)  // если, используя, попробуйте также выражения    "Понедельник"  еще    "другой день";def Икс = пытаться int.Разобрать(someString)        ловить { | FormatException() => 0 };def Икс = returnBlock :   {    для каждого (я в [1, 2, 3])      когда (я > 2)        returnBlock(истинный); // выход из блока (x = true)    ложный // x = false  };

Кортежи

def k = (1, "один"); // k: (int * строка)def (а, б) = k; // a = 1, b = "один"

Сопоставление с образцом

def результат = матч (номер){  | 0            => "нуль"  | 1            => "один"  | Икс когда Икс < 0 => "отрицательный"  | _            => "больше одного"}
Другие примеры сопоставления с образцом

Сопоставление типов с привязкой переменных:

def проверить (о : объект) {  матч (о)   {    | я является int    => $ "Целое число: $ i"    | s является нить => $ "Строка: $(s.To Верхний())"    | _           => «Объект другого типа»  }}

Сопоставление с образцом кортежа:

матч (кортеж) {  | ( 42, _ ) => «42 на первой позиции»  | ( _, 42 ) => «42 на второй позиции»  | ( Икс, у )  => $"( $ x, $ y )"}

Соответствие регулярного выражения:

с помощью Nemerle.Текст;регулярное выражение матч (ул.) {  | "а +. *"                          => printf("а  п");  | @ "(? <число: int>  d +) -  w +"        => printf("% d  n", число + 3);  | "(? <имя> (Ала | Касия))? ma kota" =>     матч (имя)      {       | Немного (п) => printf("% s  n", п)       | Никто     => printf("noname?  n")     }  | _                               => printf("по умолчанию  n");}

Функциональные типы и локальные функции

с помощью Система.Консоль; // классы и модули (статические классы) могут быть помещены в пространства именdef следующий(Икс) { Икс + 1 }; // тип аргумента x и другие аргументы функции могут быть выведены из использованияdef мульт(Икс, у) { Икс * у };def Фибоначчи(я){  | 0     => 0  | 1     => 1  | Другой => Фибоначчи(я - 1) + Фибоначчи(я - 2)};WriteLine(следующий(9));        // 10 аналогично «Console.WriteLine (next (9));» WriteLine(мульт(2, 2));     // 4WriteLine(Фибоначчи(10)); // 55

Варианты

Варианты (называемые типами данных или типами сумм в SML и OCaml) представляют собой формы выражения данных нескольких различных типов:

 вариант RgbColor {   | красный   | Желтый   | Зеленый   | Разные {       красный : плавать;       зеленый : плавать;       синий : плавать;     } }

Метапрограммирование

Система макросов Nemerle позволяет создавать, анализировать и изменять программный код во время компиляции. Макросы можно использовать в форме вызова метода или как новую языковую конструкцию. Многие конструкции в языке реализованы с использованием макросов (if, for, foreach, while, using и т. Д.).

"если"пример макроса:

макрос @если (cond, e1, e2)синтаксис ("если", "(", cond, ")", e1, Необязательный (";"), "еще", e2){  /*    <[]> определяет область квазицитирования, компилятор Nemerle преобразует код в ней     в AST такие преобразования чем-то похожи на компиляцию Expression в C #  */  <[    матч ($ конд : bool)    {      | истинный => $ e1      | _ => $ e2    }  ]>}// используя этот макрос в коде:def Максимум = если (а > б) а еще б;// во время компиляции верхняя строка будет преобразована в это:def Максимум = матч (а > б){  | истинный => а  | _    => б}

IDE

Nemerle можно интегрировать в интегрированная среда развития (IDE) Visual Studio 2008. Он также имеет полностью бесплатную IDE на основе Visual Studio 2008 Shell.[5] (подобно Visual Studio Express Editions ) и SharpDevelop (ссылка на исходный код плагина ).

Nemerle также можно интегрировать в Visual Studio 2010 с помощью надстройки.[6]

Примеры

Привет, мир!

Традиционный Привет, мир! может быть реализован в стиле C #:

учебный класс Привет{  статический Главный () : пустота  {    Система.Консоль.WriteLine ("Привет, мир!");  }}

или проще:

Система.Консоль.WriteLine("Привет, мир!");

Примеры макросов

Макросы позволяют генерировать шаблонный код с добавленными статическими проверками, выполняемыми компилятором. Они сокращают объем кода, который должен быть написан вручную, делают генерацию кода более безопасной и позволяют программам генерировать код с проверками компилятора, сохраняя при этом исходный код относительно небольшим и читабельным.

Форматирование строки

Макрос форматирования строк упрощает переменные для манипуляций со строками с помощью $ notation:

def s = $ "Число $ i"; // вставляем значение переменной i, куда помещается $ i def s = $"$ x + $ y = $(Икс+у)"; // $ (...) можно использовать для вычислений или доступа к членам

Декларативная генерация кода

Структурное равенство, Запоминать, json, и с макросы, которые генерируют код во время компиляции. Хотя некоторые из них (Структурное равенство, Запоминать) могут выглядеть как атрибуты C #, во время компиляции они будут проверены компилятором и преобразованы в соответствующий код с использованием логики, предопределенной их макросами.

[Структурное равенство] // Реализуем интерфейс IEquatable [Sample] .Net, используя равенство путем сравнения элементов.учебный класс Образец{   [Memoize]  // запоминаем первый результат оценки    общественный статический SomeLongEvaluations() : int     {       MathLib.РассчитатьNthPrime(10000000)   }   [DependencyProperty] // Свойство зависимости WPF   общественный DependencyPropertySample { получать; набор; }      общественный статический Главный() : пустота   {/ * синтаксический макрос "json" генерирует код: JObject.Object ([("a", JValue.Number (SomeLongEvaluations ())), ("b", JValue.Number (SomeLongEvaluations () + 1))])*/       def jObject = json { а: SomeLongEvaluations(); б: (SomeLongEvaluations() + 1)} // макрос инициализации объекта "<-" - это разработка инициализации объекта фигурных скобок C #       def k = Диагностика.Процесс() <-        {          StartInfo <- // может инициировать свойства внутренних объектов без вызова ctor          {              Имя файла = "calc.exe";              UseShellExecute = истинный;          }             Вышел += () => WriteLine("Расчет выполнен"); // события и делегаты       }       ReadLine();   }}

Доступность базы данных

Использование макросов Nemerle для SQL ты можешь написать:

ExecuteReaderLoop("ВЫБЕРИТЕ имя, фамилию ОТ сотрудника, ГДЕ имя = $ myparm", dbcon,  {    WriteLine ($ "Имя: $ firstname$ фамилия")  });

вместо

нить sql = "ВЫБЕРИТЕ имя, фамилию ОТ сотрудника, ГДЕ firstname =: a";с помощью (NpgsqlCommand dbcmd = новый NpgsqlCommand (sql, dbcon, dbtran)){  dbcmd.Параметры.Добавлять("а", моя пара);  с помощью (NpgsqlReader читатель = dbcmd.ExecuteReader())  {     пока(читатель.Читать())      {        вар имя = читатель.GetString (0);        вар фамилия = читатель.GetString (1);        Консоль.WriteLine ("Имя: {0} {1}", имя, фамилия)     }  }}

и это не просто сокрытие некоторых операций в библиотеке, а дополнительная работа, выполняемая компилятором для понимания строки запроса, используемых в ней переменных и столбцов, возвращаемых из базы данных. Макрос ExecuteReaderLoop сгенерирует код, примерно эквивалентный тому, который вам придется вводить вручную. Более того, он подключается к базе данных во время компиляции, чтобы проверить, действительно ли ваш SQL-запрос имеет смысл.

Новые языковые конструкции

С помощью макросов Nemerle вы также можете ввести в язык новый синтаксис:

макрос ReverseFor (я, начало, тело)синтаксис ("ford", "(", i, ";", begin, ")", body) {<[for ($ i = $ begin; $ i> = 0; $ i--) $ body]>}

определяет макрос, вводящий ford (EXPR; EXPR) EXPR синтаксис и может использоваться как

форд (я; п) печать (я);

Nemerle с ASP.NET

Nemerle может быть встроен непосредственно в ASP.NET:

<%@ Страница Язык=«Немерле» %><сценарий runat ="сервер">    Page_Load(_ : объект, _ : EventArgs) : пустота {        Сообщение.Текст = $"Последний раз вы открывали эту страницу: $ (DateTime.Now)";    }    EnterBtn_Click(_ : объект, _ : EventArgs) : пустота {        Сообщение.Текст = $«Привет, $ (Name.Text), добро пожаловать в ASP.NET!»;    }</script><html>    <body>        <форма runat ="сервер">            Пожалуйста, введите Ваше имя:  ID ="Имя" runat ="сервер" />             OnClick ="EnterBtn_Click" Текст ="Войти" runat ="сервер" />            

ID ="Сообщение" runat ="сервер" />

</form> </body></html>

... Или хранятся в отдельном файле и вводятся одной строкой:

<%@ Страница Язык=«Немерле» Src="test.n" Наследует="Тест" %>

PInvoke

Nemerle может использовать собственные библиотеки платформы. Синтаксис очень похож на C # и другие языки .NET. Вот самый простой пример:

с помощью Система;с помощью System.Runtime.InteropServices;учебный класс PlatformInvokeTest{    [DllImport ("msvcrt.dll")]    общественный внешний статический ставит(c : нить) : int;    [DllImport ("msvcrt.dll")]    внутренний внешний статический _flushall() : int;    общественный статический Главный() : пустота    {        _ = ставит("Тест");        _ = _flushall();    }}

Рекомендации

  1. ^ Немерле 1.2.507.0
  2. ^ "Twitter / orangy: Мы решили принести Nemerle". Twitter.com. Получено 2013-09-05.
  3. ^ "Блог об инструментах .NET JetBrains» JetBrains и Nemerle ". Blogs.jetbrains.com. 2012-06-27. Получено 2013-09-05.
  4. ^ "Google Discussiegroepen". Groups.google.com. Получено 2013-09-05.
  5. ^ Установщик установки Nemerle Studio Microsoft можно установить после установки Изолированная оболочка Visual Studio 2008
  6. ^ Надстройка Visual Studio 2010

дальнейшее чтение

внешняя ссылка