(Translated by https://www.hiragana.jp/)
Nemerle - Wikipedia

Nemerleネマール)は.NETプラットフォームうえ動作どうさする静的せいてき型付かたつ高級こうきゅう言語げんごである。

Nemerle
パラダイム マルチパラダイム: 関数かんすうがたオブジェクト指向しこう命令めいれいがた
設計せっけいしゃ Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszta
最新さいしんリリース 1.2.547.0/ 2017ねん9がつ1にち (7ねんまえ) (2017-09-01)
型付かたつ つよ静的せいてき型付かたつかた推論すいろんあり
おも処理しょりけい .NET FrameworkMono
影響えいきょうけた言語げんご MLC#
ライセンス BSD Like License
ウェブサイト www.nemerle.org
テンプレートを表示ひょうじ

手続てつづがた、オブジェクト指向しこう関数かんすうがた言語げんご機能きのうんだハイブリッド言語げんごであり、C#によく構文こうぶん構造こうぞう強力きょうりょくなメタプログラミング機能きのう特徴とくちょうとなっている。

Wrocław University(ポーランド)のKamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olsztaらによって開発かいはつされた。

現在げんざいではロシアの開発かいはつコミュニティであるRSDNによって開発かいはつ保守ほしゅがされているが、2012ねんよりJetBrainsがコア開発かいはつしゃ雇用こようして、"N2" とばれる新規しんき既存きそん言語げんご実装じっそうするためのフレームワークの開発かいはつ注力ちゅうりょくしている。[1][2][3]


特徴とくちょう

編集へんしゅう

おそらくNemerleのもっと重要じゅうよう特徴とくちょうは、オブジェクト指向しこうプログラミングと関数かんすうがたプログラミングの両方りょうほう混在こんざい可能かのうであるということであろう。プログラムのトップレベルではオブジェクト指向しこう構造こうぞうもちいるが、メソッド本体ほんたいには関数かんすうがたのスタイルをもちいることもできる。これはいくつかのプログラムにおいて非常ひじょう便利べんり機能きのうする。以下いか特徴とくちょうてき機能きのうしめす。

メタプログラミング機能きのうはコンパイラの高度こうど拡張かくちょう可能かのうとしており、プログラマの負担ふたん可能かのうかぎ軽減けいげんしつつ、ドメイン固有こゆう言語げんごみ、部分ぶぶん評価ひょうかアスペクト指向しこうプログラミングなどを可能かのうにしている。

また、ジェネリックプログラミングラムダ拡張かくちょうメソッドなどといったCLIすべての機能きのう利用りようすることができ、.NETのライブラリをC#おなじくらい(あるいはそれ以上いじょうに)簡単かんたんあつかうことも可能かのうである。

以下いかでは、これらの機能きのうをNemerleちゅうでどのように利用りようできるかをいくつかのれいげて説明せつめいする。

かた推論すいろん

編集へんしゅう
def x = 1;           // int
def myList = List(); // ジェネリックがた List[T] として宣言せんげんされ、その使つかわれかたから推論すいろんされる
myList.Add(x);       // コンパイラにより 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 (i in [1, 2, 3])
      when (i > 2)
        returnBlock(true); // ブロックをける ( 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"
}
そののパターンマッチングのれい

変数へんすうパターン(変数へんすう束縛そくばくする):

def check (o : object) {
  match (o) 
  {
    | i is int    => $"An int: $i"
    | s is string => $"A string: $(s.ToUpper())"
    | _           => "Object of another type"
  }
}

タプルにたいするマッチ:

match (tuple) 
{
  | ( 42, _ ) => "42 on first position"
  | ( _, 42 ) => "42 on second position"
  | ( x, y )  => $"( $x, $y )"
}

正規せいき表現ひょうげんによるマッチ:

using Nemerle.Text;
regexp match (str) {
  | "a+.*"                          => printf("a\n");
  | @"(?<num : int>\d+)-\w+"        => printf("%d\n", num + 3);
  | "(?<name>(Ala|Kasia))? ma kota" =>
     match (name) 
     {
       | Some (n) => printf("%s\n", n)
       | None     => printf("noname?\n")
     }

  | _                               => printf("default\n");
}

関数かんすうがたとローカル関数かんすう

編集へんしゅう
using System.Console; // クラスとモジュール(静的せいてきクラス)を名前なまえ空間くうかんとして使用しようできる
def next(x) { x + 1 }; // 引数ひきすう x のかた使つかわれかたから推論すいろんされる

def mult(x, y) { x * y };

def fibonacci(i)
{
  | 0     => 0
  | 1     => 1
  | other => fibonacci(i - 1) + fibonacci(i - 2)
};

WriteLine(next(9));        // 10  "Console.WriteLine(next(9));" とひとしい 
WriteLine(mult(2, 2));     // 4
WriteLine(fibonacci(10)); // 55

バリアント (代数だいすうてきデータがたとも) は複数ふくすう種類しゅるい表現ひょうげんできる:

 variant RgbColor{
   | Red
   | Yellow
   | Green
   | Different {
       red : float;
       green : float;
       blue : float;
     }
 }

メタプログラミング

編集へんしゅう

Nemerle のマクロ機能きのうは、コンパイルちゅうにプログラムちゅうのコードの生成せいせい解析かいせき編集へんしゅう可能かのうにする。マクロは通常つうじょうのメソッドしとして使つかえるほか、構文こうぶん定義ていぎしてもちいることもできる。Nemerleのおおくの構文こうぶん(if、for、foreach、while、usingなど)はマクロによって定義ていぎされている。

"if" マクロのれい:

macro @if (cond, e1, e2)
syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)
{
  /*
    <[ ]> はコードクォートであり、Nemerleコンパイラは中身なかみ構文こうぶん変換へんかんして提供ていきょうする。
    C# におけるしきているところがある。
  */
  <[
    match ($cond : bool)
    {
      | true => $e1
      | _ => $e2
    }
  ]>
}

// コードちゅうでマクロを使つかう:
def max = if (a > b) a else b;
// コンパイルちゅううえのコードはしたのように展開てんかいされる:
def max = match (a > b)
{
  | true => a
  | _    => b
}

統合とうごう開発かいはつ環境かんきょう

編集へんしゅう

NemerleはVisual Studio 2008統合とうごうすることができる。Visual Studio 2008 Shellをベースとした無料むりょうのIDEも存在そんざいする。[4]

また、SharpDevelopようのプラグインも用意よういされている(プラグインのページ)。

アドインによりVisual Studio 2010にも統合とうごう可能かのうで、Visual Studio 2013はん存在そんざいしている。

伝統でんとうてきHello worldは、つぎのようにC#ライクなスタイルでくことができる。

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

あるいは、よりシンプルに

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

ともける。

マクロのれい

編集へんしゅう

文字もじれつフォーマット

編集へんしゅう

$ 記号きごうにより文字もじれつちゅう展開てんかいすることができる:

def s = $"The number is $i"; // $i を変数へんすう i のえる 
def s = $"$x + $y = $(x+y)"; // $(...) を使つかうことで複雑ふくざつしき展開てんかいできる

コード生成せいせい

編集へんしゅう

StructuralEqualityMemoizejsonwithなどはコンパイルにコードを生成せいせいするマクロである。 いくつかのマクロ(StructuralEquality, Memoize)はC#における属性ぞくせいのようにえるが、コンパイル適切てきせつなコードへの変換へんかんおこなう。

[StructuralEquality] // IEquatable[Sample] インターフェースを自動じどう実装じっそうするマクロ
class Sample
{
   [Memoize]  // 最初さいしょ計算けいさん結果けっか保持ほじする
   public static SomeLongEvaluations() : int  
   {
       MathLib.CalculateNthPrime(10000000)
   }

   [DependencyProperty] // WPF 依存いぞん関係かんけいプロパティ
   public DependencyPropertySample { get; set; }
   
   public static Main() : void
   {
/* 構文こうぶんマクロ "json" はつぎのようなコードを生成せいせいする:
JObject.Object([("a", JValue.Number(SomeLongEvaluations())), ("b", JValue.Number(SomeLongEvaluations() + 1))])
*/
       def jObject = json { a: SomeLongEvaluations(); b: (SomeLongEvaluations() + 1)} 
// オブジェクト初期しょきマクロ "<-" はC#のオブジェクト初期しょきおな機能きのう提供ていきょうする
       def k = Diagnostics.Process() <- 
       {
          StartInfo <- // コンストラクタしなしに内部ないぶのプロパティの初期しょきおこなえる
          {
              FileName = "calc.exe";
              UseShellExecute = true;
          }   
          Exited += () => WriteLine("Calc done"); // イベントとデリゲート
       }

       ReadLine();
   }
}

データベースへのアクセス

編集へんしゅう

たとえば、NemerleのマクロをもちいてSQLぶん発行はっこうするコードは以下いかのようにくことができる。

 ExecuteReaderLoop ("SELECT firstname, lastname FROM employee WHERE firstname = $myparm", dbcon,
 {
   System.Console.WriteLine ("Name: {0} {1}", firstname, lastname) 
 });

これは、つぎぶんわりにもちいられる。

 string sql = "SELECT firstname, lastname FROM employee WHERE firstname = :a";
 NpgsqlCommand dbcmd = new NpgsqlCommand (sql, dbcon, dbtran);
 dbcmd.Parameters.Add("a", myparm);
 
 NpgsqlReader reader = dbcmd.ExecuteReader();
 
 while(reader.Read()) {
   string firstname = reader.GetString (0);
   string lastname = reader.GetString (1);
   System.Console.WriteLine ("Name: {0} {1}", firstname, lastname) 
 }
 reader.Close();
 dbcmd.Dispose();

これは、ライブラリちゅういくつかの動作どうさかくすだけでなく、クエリ文字もじれつ変数へんすう、データベースからかえされたコラムがコンパイラによって理解りかいされ実行じっこうされるということをあらわしている。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);

Nemerleと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. ^ Twitter / orangy: We've decided to bring Nemerle”. Twitter.com. 2013ねん9がつ5にち閲覧えつらん
  2. ^ JetBrains .NET Tools Blog » JetBrains and Nemerle”. Blogs.jetbrains.com (2012ねん6がつ27にち). 2013ねん9がつ5にち閲覧えつらん
  3. ^ Google Discussiegroepen”. Groups.google.com. 2013ねん9がつ5にち閲覧えつらん
  4. ^ Nemerle Studio Microsoft Setup Installer can be installed after installation of Visual Studio Shell 2008 Isolated

参考さんこう

編集へんしゅう

外部がいぶリンク

編集へんしゅう