Немерль
Парадигма | Мультипарадигма : аспектно-ориентированная , событийно-ориентированная , функциональная , универсальная , императивная , мета , объектно-ориентированная , рефлексивная. |
---|---|
Семья | С# |
Разработано | Камиль Скальский, Михал Москаль, проф. Лешек Пахольский, Павел Ольшта во Вроцлавском университете |
Разработчик | JetBrains (ранее) РСДН |
Впервые появился | 2003 год |
Стабильная версия | 1.2.507.0 [1]
/ 6 августа 2016 г |
Дисциплина набора текста | Предполагаемый , номинальный , статический , сильный |
Платформа | интерфейс командной строки |
Расширения имен файлов | .n |
Веб-сайт | неизмеренный |
Основные реализации | |
Немерль | |
Под влиянием | |
С# , Лисп , ML |
Nemerle — это общего назначения , высокоуровневый разработанный статически типизированный язык программирования для платформ, использующих Common Language Infrastructure ( .NET / Mono ). Он предлагает функциональные , объектно-ориентированные , аспектно-ориентированные , рефлексивные и императивные функции. Он имеет простой синтаксис, подобный C# , и мощную систему метапрограммирования .
В июне 2012 года основные разработчики Nemerle были наняты чешской программного обеспечения компанией по разработке JetBrains . Команда сосредоточилась на разработке Nitra, среды для реализации существующих и новых языков программирования. [2] [3] [4] JetBrains, похоже, отказалась от языка Nemerle и Nitra; Nitra не обновлялась ее первоначальными создателями с 2017 года, а Nemerle теперь полностью поддерживается Российской сетью разработчиков программного обеспечения, независимо от JetBrains, хотя никаких серьезных обновлений еще не было выпущено, и разработка продвигается очень медленно. Ни Nemerle, ни Nitra не упоминались и не упоминались JetBrains в течение многих лет.
Немерль назван в честь архимага Неммерле, персонажа фантастического романа «Волшебник Земноморья» Урсулы К. Ле Гуин .
Функции
[ редактировать ]![]() | Этот раздел включает в себя список использованной литературы , связанную литературу или внешние ссылки , но его источники остаются неясными, поскольку в нем отсутствуют встроенные цитаты . ( сентябрь 2013 г. ) |
Наиболее примечательной особенностью Nemerle является возможность смешивать объектно-ориентированные и функциональные стили программирования. Программы могут быть структурированы с использованием объектно-ориентированных концепций, таких как классы и пространства имен, а методы могут (необязательно) быть написаны в функциональном стиле. Другие примечательные особенности включают в себя:
- строгий вывод типа
- a flexible metaprogramming subsystem (using macros )
- полная поддержка объектно-ориентированного программирования (ООП) в стиле C#, Java и C++.
- полная поддержка функционального программирования в стиле ML , OCaml и Haskell со следующими функциями:
- функции высшего порядка
- сопоставление с образцом
- алгебраические типы
- локальные функции
- кортежи и анонимные типы
- частичное применение функций
Система метапрограммирования обеспечивает большую расширяемость компилятора , встраивание предметно-ориентированных языков , частичную оценку и аспектно-ориентированное программирование , используя высокоуровневый подход, чтобы снять как можно большую часть бремени с программистов. Язык сочетает в себе все Common Language Infrastructure стандартные функции (CLI), включая параметрический полиморфизм , лямбда-выражения , методы расширения и т. д. Доступ к библиотекам, включенным в платформы .NET или Mono, так же прост, как и в C#.
Вывод типа
[ редактировать ]def x = 1; // int
def myList = List(); // generic List[T], type T is deduced from the usage in the next line
myList.Add(x); // compiler deduces type of T as int making myList type of List[int]
Все есть выражение
[ редактировать ]def x =
{ // similar to x = 3
def y = 1;
def z = 2;
y + z // this last statement is a block return value
};
def x =
if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) // if, using, try are also expressions
"Monday"
else
"other day";
def x = try int.Parse(someString)
catch { | FormatException() => 0 };
def x = returnBlock :
{
foreach (i in [1, 2, 3])
when (i > 2)
returnBlock(true); // exit block (x = true)
false // x = false
};
Кортежи
[ редактировать ]def k = (1, "one"); // k : (int * string)
def (a, b) = k; // a = 1, b = "one"
Сопоставление с образцом
[ редактировать ]def result = match (number)
{
| 0 => "zero"
| 1 => "one"
| x when x < 0 => "negative"
| _ => "more than one"
}
Функциональные типы и локальные функции
[ редактировать ]using System.Console; // classes and modules (static classes) can be put in namespaces
def next(x) { x + 1 }; // the type of x argument and other function arguments can be deduced from usage
def mult(x, y) { x * y };
def fibonacci(i)
{
| 0 => 0
| 1 => 1
| other => fibonacci(i - 1) + fibonacci(i - 2)
};
WriteLine(next(9)); // 10 similar to "Console.WriteLine(next(9));"
WriteLine(mult(2, 2)); // 4
WriteLine(fibonacci(10)); // 55
Варианты
[ редактировать ]Варианты (называемые типами данных или типами сумм в SML и OCaml) — это формы выражения данных нескольких различных типов:
variant RgbColor {
| Red
| Yellow
| Green
| Different {
red : float;
green : float;
blue : float;
}
}
Metaprogramming
[ редактировать ]Система макросов Nemerle позволяет создавать, анализировать и изменять программный код во время компиляции. Макросы можно использовать в форме вызова метода или как новую языковую конструкцию. Многие конструкции языка реализованы с помощью макросов (if, for, foreach, while, using и т. д.).
Пример макроса " if ":
macro @if (cond, e1, e2)
syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)
{
/*
<[ ]> defines an area of quasi-quotation, the Nemerle compiler transforms the code in it
to an AST, such transformations are somewhat similar to an Expression compiling in C#
*/
<[
match ($cond : bool)
{
| true => $e1
| _ => $e2
}
]>
}
// using this macro in code:
def max = if (a > b) a else b;
// during a compile time the upper line will be transformed to this:
def max = match (a > b)
{
| true => a
| _ => b
}
Синтаксис без скобок
[ редактировать ]Подобно синтаксису без фигурных скобок, позже добавленному в Scala , Nemerle позволяет программисту опционально использовать синтаксис, чувствительный к пробелам, основанный на правиле оффсайда , аналогично Python .
Следующий фрагмент фигурных скобок:
using System.Console;
[Qux]
class FooBar {
public static Main(): void {
WriteLine("Hello")
}
static Foo (x: int): void {
if (x == 3) {
def y = x * 42;
Foo (x)
} else {
[x].Map (fun (x) {
x * 2
})
}
}
static Bar(): int {
def foo = 2 + 7 * 13;
foo
}
}
можно переписать как:
using System.Console;
[Qux] \
class FooBar
public static Main(): void
WriteLine("Hello")
static Foo (x: int): void
if (x == 3)
def y = x * 42;
Foo (x)
else
[x].Map (fun (x) {
x * 2
})
static Bar(): int
def foo = 2 + 7 * 13
foo
Примечательно, что невозможно разбить выражения или альтернативные предложения в совпадениях по нескольким строкам без использования обратной косой черты. \
:
// This will not compile ...
static Bar(): int
def foo = 2
+ 7
* 13
foo
match (s)
| "a"
| "aa" => 1
| "b"
| "bb" => 2
| _ => 0
// But this will:
static Bar(): int
def foo = 2 \
+ 7 \
* 13
foo
match (s)
| "a" \
| "aa" => 1
| "b" \
| "bb" => 2
| _ => 0
Чтобы активировать этот синтаксис, пользователь должен добавить #pragma indent
в начало файла или используйте опцию компилятора -i
.
ИДЕТ
[ редактировать ]Nemerle можно интегрировать в интегрированную среду разработки (IDE) Visual Studio 2008 . Он также имеет полностью бесплатную IDE на основе Visual Studio 2008 Shell. [5] (например, Visual Studio Express Editions ) и SharpDevelop ( ссылка на исходный код плагина ).
Nemerle также можно интегрировать в Visual Studio (до 2017 года) с помощью надстроек и расширений. [6]
Примеры
[ редактировать ]Привет, мир!
[ редактировать ]Традиционный привет, мир! может быть реализовано более похожим на C# способом:
class Hello
{
static Main () : void
{
System.Console.WriteLine ("Hello, world!");
}
}
или проще:
System.Console.WriteLine("Hello, world!");
Примеры макросов
[ редактировать ]Макросы позволяют генерировать шаблонный код с дополнительными статическими проверками, выполняемыми компилятором. Они уменьшают объем кода, который необходимо писать вручную, делают генерацию кода более безопасной и позволяют программам генерировать код с проверками компилятора, сохраняя при этом исходный код относительно небольшим и удобочитаемым.
Форматирование строк
[ редактировать ]Макрос форматирования строк упрощает переменные для манипуляций со строками, используя обозначение $:
def s = $"The number is $i"; //insert the value of the variable i where $i is placed
def s = $"$x + $y = $(x+y)"; // $(...) can be used to make calculations or access members
Декларативная генерация кода
[ редактировать ]StructuralEquality , Memoize , json и with — это макросы, которые генерируют код во время компиляции. Хотя некоторые из них ( StructuralEquality , Memoize ) могут выглядеть как атрибуты C#, во время компиляции они будут проверены компилятором и преобразованы в соответствующий код с использованием логики, предопределенной их макросами.
[StructuralEquality] // Implement IEquatable[Sample] .Net interface using by element comparison equality.
class Sample
{
[Memoize] // remember first evaluation result
public static SomeLongEvaluations() : int
{
MathLib.CalculateNthPrime(10000000)
}
[DependencyProperty] // WPF dependency property
public DependencyPropertySample { get; set; }
public static Main() : void
{
/* syntax macro "json" generates code:
JObject.Object([("a", JValue.Number(SomeLongEvaluations())), ("b", JValue.Number(SomeLongEvaluations() + 1))])
*/
def jObject = json { a: SomeLongEvaluations(); b: (SomeLongEvaluations() + 1)}
// object initialization macro "<-" 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"); // events and delegates
}
ReadLine();
}
}
Доступность базы данных
[ редактировать ]Используя макросы Nemerle для SQL, вы можете написать:
ExecuteReaderLoop("SELECT firstname, lastname FROM employee WHERE firstname = $myparm", dbcon,
{
WriteLine ($"Name: $firstname $lastname")
});
вместо
string sql = "SELECT firstname, lastname FROM employee WHERE firstname = :a";
using (NpgsqlCommand dbcmd = new NpgsqlCommand (sql, dbcon, dbtran))
{
dbcmd.Parameters.Add("a", myparm);
using (NpgsqlReader reader = dbcmd.ExecuteReader())
{
while(reader.Read())
{
var firstname = reader.GetString (0);
var lastname = reader.GetString (1);
Console.WriteLine ("Name: {0} {1}", firstname, lastname)
}
}
}
и это не просто сокрытие каких-то операций в библиотеке, а дополнительная работа компилятора по пониманию строки запроса, используемых там переменных и столбцов, возвращаемых из базы данных. Макрос ExecuteReaderLoop сгенерирует код, примерно эквивалентный тому, который вам придется вводить вручную. Более того, он подключается к базе данных во время компиляции, чтобы проверить, действительно ли ваш SQL-запрос имеет смысл.
Новые языковые конструкции
[ редактировать ]С помощью макросов Nemerle вы также можете ввести в язык новый синтаксис:
macro ReverseFor (i, begin, body)
syntax("ford", "(", i, ";", begin, ")", body)
{
<[ for ($i = $begin; $i >= 0; $i--) $body ]>
}
определяет макрос, вводящий ford (EXPR ; EXPR) Синтаксис EXPR и может использоваться как
ford (i ; n) print (i);
Немерле с ASP.NET
[ редактировать ]Nemerle может быть встроен непосредственно в ASP.NET :
<%@ Page Language="Nemerle" %>
<script runat="server">
Page_Load(_ : object, _ : EventArgs) : void {
Message.Text = $"You last accessed this page at: $(DateTime.Now)";
}
EnterBtn_Click(_ : object, _ : EventArgs) : void {
Message.Text = $"Hi $(Name.Text), welcome to ASP.NET!";
}
</script>
<html>
<body>
<form runat="server">
Please enter your name: <asp:TextBox ID="Name" runat="server" />
<asp:Button OnClick="EnterBtn_Click" Text="Enter" runat="server" />
<p><asp:Label ID="Message" runat="server" /></p>
</form>
</body>
</html>
...Или сохранить в отдельном файле и ввести одной строкой:
<%@ Page Language="Nemerle" Src="test.n" Inherits="Test" %>
ПИнвоке
[ редактировать ]Nemerle может использовать преимущества собственных библиотек платформы. Синтаксис очень похож на синтаксис C# и других языков .NET. Вот самый простой пример:
using System;
using System.Runtime.InteropServices;
class PlatformInvokeTest
{
[DllImport("msvcrt.dll")]
public extern static puts(c : string) : int;
[DllImport("msvcrt.dll")]
internal extern static _flushall() : int;
public static Main() : void
{
_ = puts("Test");
_ = _flushall();
}
}
Ссылки
[ редактировать ]- ^ Немерль 1.2.507.0
- ^ «Твиттер/оранжевый: Мы решили привезти Немерле» . Twitter.com . Проверено 5 сентября 2013 г.
- ^ «Блог об инструментах JetBrains .NET » JetBrains и Nemerle» . Блоги.jetbrains.com. 27 июня 2012 г. Проверено 5 сентября 2013 г.
- ^ "Google Дискуссионная группа" . Проверено 5 сентября 2013 г.
- ^ Установщик Nemerle Studio Microsoft можно установить после установки изолированной оболочки Visual Studio 2008.
- ^ Надстройка Visual Studio 2010.
Дальнейшее чтение
[ редактировать ]- Публикации о Немерле в официальном российском научном журнале RSDN Magazine.
- Москаль, Михал (27 июня 2005 г.). «Вывод типа с отсрочкой» (PDF) . Институт компьютерных наук Вроцлавского университета.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - Презентация «Немерль примечательна» Дениса Рысцова
- Статья «Нетрадиционные языки для нетрадиционных суперкомпьютеров» Андрея Адинца
Внешние ссылки
[ редактировать ]- Языки программирования
- Процедурные языки программирования
- Языки программирования .NET
- Объектно-ориентированные языки программирования
- Языки программирования, созданные в 2003 году.
- программное обеспечение 2003 года
- Языки программирования высокого уровня
- Аспектно-ориентированное программирование
- Функциональные языки