Jump to content

Немерль

Немерль
Парадигма Мультипарадигма : аспектно-ориентированная , событийно-ориентированная , функциональная , универсальная , императивная , мета , объектно-ориентированная , рефлексивная.
Семья С#
Разработано Камиль Скальский, Михал Москаль, проф. Лешек Пахольский, Павел Ольшта во Вроцлавском университете
Разработчик JetBrains (ранее)
РСДН
Впервые появился 2003 год ; 21 год назад ( 2003 )
Стабильная версия
1.2.507.0 [1] / 6 августа 2016 г .; 7 лет назад ( 06.08.2016 )
Дисциплина набора текста Предполагаемый , номинальный , статический , сильный
Платформа интерфейс командной строки
Расширения имен файлов .n
Веб-сайт неизмеренный .org
Основные реализации
Немерль
Под влиянием
С# , Лисп , 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 в течение многих лет.

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

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

Система метапрограммирования обеспечивает большую расширяемость компилятора , встраивание предметно-ориентированных языков , частичную оценку и аспектно-ориентированное программирование , используя высокоуровневый подход, чтобы снять как можно большую часть бремени с программистов. Язык сочетает в себе все 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. ^ Немерль 1.2.507.0
  2. ^ «Твиттер/оранжевый: Мы решили привезти Немерле» . Twitter.com . Проверено 5 сентября 2013 г.
  3. ^ «Блог об инструментах JetBrains .NET » JetBrains и Nemerle» . Блоги.jetbrains.com. 27 июня 2012 г. Проверено 5 сентября 2013 г.
  4. ^ "Google Дискуссионная группа" . Проверено 5 сентября 2013 г.
  5. ^ Установщик Nemerle Studio Microsoft можно установить после установки изолированной оболочки Visual Studio 2008.
  6. ^ Надстройка Visual Studio 2010.

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

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1bbb7a5263a079d705685636fa0aa4e3__1715217060
URL1:https://arc.ask3.ru/arc/aa/1b/e3/1bbb7a5263a079d705685636fa0aa4e3.html
Заголовок, (Title) документа по адресу, URL1:
Nemerle - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)