Nemerle - Nemerle
Парадигма | Мультипарадигма: функциональный, императив, мета, объектно-ориентированный |
---|---|
Разработано | Камил Скальски, Михал Москаль, Проф. Лешек Пахольски, Павел Ольшта в Вроцлавский университет |
Разработчик | JetBrains |
Впервые появился | 2003 |
Стабильный выпуск | 1.2.507.0[1] / 6 августа 2016 г. |
Печатная дисциплина | Предполагаемый, номинальный, статический, сильный |
Платформа | CLI |
Расширения имени файла | .n |
Интернет сайт | немерле |
Основной реализации | |
Nemerle | |
Под влиянием | |
C #, Лисп, ML |
Nemerle это общее назначение, высокий уровень, статически типизированный язык программирования разработан для платформ, использующих Инфраструктура общего языка (.СЕТЬ /Мононуклеоз ). Это предлагает функциональный, объектно-ориентированный и императив Особенности. Имеет простой C # -подобный синтаксис и мощный метапрограммирование система. В июне 2012 года основные разработчики Nemerle были наняты Чешский программного обеспечения девелоперская компания JetBrains. Команда сосредоточена на разработке Nitra, фреймворка для реализации существующих и новых языков программирования. Эта структура, вероятно, будет использоваться для создания будущих версий Nemerle.[2][3][4]
Немерле назван в честь верховного мага Неммерле, персонажа фантастического романа. Волшебник Земноморья к Урсула К. Ле Гуин.
Функции
Этот раздел включает Список ссылок, связанное чтение или внешняя ссылка, но его источники остаются неясными, потому что в нем отсутствует встроенные цитаты.Сентябрь 2013) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Наиболее примечательной особенностью Nemerle является возможность смешивать стили программирования, которые объектно-ориентированный и функциональный. Программы могут быть структурированы с использованием объектно-ориентированных концепций, таких как классы и пространства имен, в то время как методы могут (необязательно) быть написаны в функциональном стиле. Другие примечательные особенности включают:
- сильный вывод типа
- гибкая подсистема метапрограммирования (использующая макросы )
- полная поддержка объектно-ориентированного программирования (ООП) в стиле C #, Ява, и C ++
- полная поддержка функционального программирования, в стиле ML, OCaml, и Haskell, с этими функциями:
Система метапрограммирования позволяет компилятор расширяемость, встраивание предметно-ориентированные языки, частичная оценка, и аспектно-ориентированное программирование, принимая высокий уровень подход, позволяющий максимально снизить нагрузку на программистов. В языке сочетаются все Инфраструктура общего языка (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.2.507.0
- ^ "Twitter / orangy: Мы решили принести Nemerle". Twitter.com. Получено 2013-09-05.
- ^ "Блог об инструментах .NET JetBrains» JetBrains и Nemerle ". Blogs.jetbrains.com. 2012-06-27. Получено 2013-09-05.
- ^ "Google Discussiegroepen". Groups.google.com. Получено 2013-09-05.
- ^ Установщик установки Nemerle Studio Microsoft можно установить после установки Изолированная оболочка Visual Studio 2008
- ^ Надстройка Visual Studio 2010
дальнейшее чтение
- Публикации о Немерле в Российском официальном научном журнале RSDN Magazine
- Москаль, Михал (27 июня 2005 г.). «Вывод типа с отсрочкой» (PDF). Институт компьютерных наук Вроцлавского университета. Цитировать журнал требует
| журнал =
(помощь) - Презентация Дениса Рыцова «Немерле примечательна».
- Статья Андрея Адинец "Нетрадиционные языки для нетрадиционных суперкомпьютеров"