Nemerle

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

Nemerle - это универсальный, высокоуровневый, статически типизированный язык программирования, разработанный для платформ, использующих Common Language Infrastructure ( .NET / Моно ). Он предлагает функциональные, объектно-ориентированные и императивные функции. Он имеет простой синтаксис, подобный C #, и мощную систему метапрограммирования. В июне 2012 года основные разработчики Nemerle были наняты чешской компанией по разработке программного обеспечения JetBrains. Команда сосредоточена на разработке Nitra, фреймворка для реализации существующих и новых языков программирования. Эта структура, вероятно, будет использоваться для создания будущих версий Nemerle.

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

Содержание
  • 1 Возможности
    • 1.1 Вывод типа
    • 1.2 Все является выражением
    • 1.3 Кортежи
    • 1.4 Сопоставление с образцом
    • 1.5 Функциональные типы и локальные функции
    • 1.6 Варианты
    • 1.7 Метапрограммирование
  • 2 IDE
  • 3 Примеры
    • 3.1 Hello, World!
    • 3.2 Примеры макросов
      • 3.2.1 Форматирование строки
      • 3.2.2 Генерация декларативного кода
      • 3.2.3 Доступность базы данных
      • 3.2.4 Новые языковые конструкции
    • 3.3 Nemerle с ASP.NET
    • 3.4 PInvoke
  • 4 Ссылки
  • 5 Дополнительная литература
  • 6 Внешние ссылки
Возможности

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

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

Вывод типа

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

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

def x = {// аналогично x = 3 def y = 1; def z = 2; y + z // этот последний оператор является возвращаемым значением блока}; def x = if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) // if, using, try также являются выражениями "Monday" else "other day"; def x = try int.Parse (someString) catch {| FormatException () =>0}; def x = returnBlock: {foreach (я в [1, 2, 3]), когда (я>2) returnBlock (true); // выход из блока (x = true) false // x = false};

Кортежи

def k = (1, "один"); // k: (int * string) def (a, b) = k; // a = 1, b = "one"

Соответствие шаблону

def result = match (number) {| 0 =>«ноль» | 1 =>«один» | x, когда x < 0 =>«отрицательный» | _ =>"более одного"}
Другие примеры сопоставления с образцом

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

def check (o: object) {match (o) {| i is int =>$ "An int: $ i" | s - строка =>$ "Строка: $ (s.ToUpper ())" | _ =>«Объект другого типа»}}

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

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

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

с использованием Nemerle.Text; совпадение регулярного выражения (str) {| "а +. *" =>printf ("а \ п"); | @ "(? \ d +) - \ w +" =>printf ("% d \ n", num + 3); | "(? (Ala | Kasia))? Ma kota" =>совпадение (имя) {| Некоторые (n) =>printf ("% s \ n", n) | Нет =>printf ("noname? \ N")} | _ =>printf ("по умолчанию \ n"); }

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

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

Варианты

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

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

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

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

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

макрос @if (cond, e1, e2) синтаксис (" if "," (", cond,") ", e1, необязательно ("; ")," else ", e2) {/ * <[ ]>определяет область квазицитирования, компилятор Nemerle преобразует код в нем в AST, такие преобразования чем-то похожи на компиляцию Expression в C # * / <[ match ($cond : bool) { | true =>$ e1 | _ =>$ e2}]>} // использование этого макроса в коде: def max = if (a>b) a else b; // во время компиляции верхняя строка будет преобразована в это: def max = match (a>b) {| true =>a | _ =>b}
IDE

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

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

Примеры

Hello, World!

Традиционный Hello World! можно реализовать в ближайшее время e Стиль в стиле C #:

class Hello {static Main (): void {System.Console.WriteLine ("Hello, world!"); }}

или проще:

System.Console.WriteLine ("Hello, world!");

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

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

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

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

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

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

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

[StructuralEquality] // Реализуйте интерфейс IEquatable [Sample].Net, используя равенство путем сравнения элементов. class Sample {[Memoize] // запомнить первый результат оценки public static SomeLongEvaluations (): int {MathLib.CalculateNthPrime (10000000)} [DependencyProperty] // Свойство зависимости WPF public DependencyPropertySample {get; установлен; } public static Main (): void {/ * макрос синтаксиса "json" генерирует код: JObject.Object ([("a", JValue.Number (SomeLongEvaluations ())), ("b", JValue.Number (SomeLongEvaluations () + 1))]) * / def jObject = json {a: SomeLongEvaluations (); b: (SomeLongEvaluations () + 1)} // макрос инициализации объекта "<-" is development of C# curly brackets object initialization def k = Diagnostics.Process() <- { StartInfo <- // can init inner objects properties without ctor call { FileName = "calc.exe"; UseShellExecute = true; } Exited += () =>WriteLine (" Calc done "); // события и делегаты} ReadLine ();}}

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

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

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

вместо

string sql = "ВЫБРАТЬ имя, фамилию ОТ сотрудника WHERE firstname =: a"; используя (NpgsqlCommand dbcmd = new NpgsqlCommand (sql, dbcon, dbtran)) {dbcmd.Parameters.Add (" a ", myparm); используя (NpgsqlReader reader = dbcmd.ExecuteReader ()) {while (reader.Read ()) {var firstname = reader.GetString (0); var lastname = reader.GetString (1); Console.WriteLine ("Имя: {0} {1}", имя, фамилия)}}}

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

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

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

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

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

ford (i; n) print (i);

Nemerle с ASP.NET

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

<%@ Page Language="Nemerle" %>
Пожалуйста, введите свое имя:

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

<%@ Page Language="Nemerle" Src="test.n" Inherits="Test" %>

PInvoke

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

using System; using System.Runtime.InteropServices; class PlatformInvokeTest {[DllImport ("msvcrt.dll")] общедоступные внешние статические вставки (c: строка): int; [DllImport ("msvcrt.dll")] внутренний внешний статический _flushall (): int; public static Main (): void {_ = put ("Test"); _ = _flushall (); }}
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-31 14:14:35
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте