Nemerle

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Nemerle
パラダイム マルチパラダイム: 関数型オブジェクト指向命令型
設計者 Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszta
最新リリース 1.0.0 / 2011年
型付け 強い静的型付け型推論あり
主な処理系 .NET FrameworkMono
影響を受けた言語 MLC#
ライセンス BSD Like License
ウェブサイト www.nemerle.org

Nemerleネマール)は.NETプラットフォーム上で動作する静的型付け高級言語である。

Wrocław University(ポーランド)のKamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olsztaらによって開発された。手続き型、オブジェクト指向、関数型言語の機能を取り込んだハイブリッド言語である。

C#によく似た構文構造と強力なメタプログラミング機能が特徴となっている。


特徴[編集]

おそらくNemerleの最も重要な特徴は、オブジェクト指向プログラミングと関数型プログラミングの両方を混在可能であるということであろう。プログラムのトップレベルではオブジェクト指向の構造を用いるが、メソッド本体には関数型のスタイルを用いることもできる。これは幾つかのプログラムにおいて非常に便利に機能する。またデリゲートバリアント型パターンマッチングなどの機能を含む。

別の特徴として、プログラマの負担を軽減するためにハイレベルなアプローチを取っていることも挙げられる。マクロ型推論などの特徴がそれに該当する。

関数型言語の世界から取り入れられた機能は、バリアント(代数的データ型)、パターンマッチング、型推論、そしてパラメータ的多態(ジェネリクス)などである。メタプログラミングシステムは高度なコンパイラ拡張、ドメイン固有言語の組み込み、部分評価アスペクト指向プログラミングなどを許容する。

また、.NETの機能をC#と同じくらい(あるいはそれ以上に)簡単に扱うことも可能である。

[編集]

Hello, World![編集]

伝統的なHello worldは、次のようにC#ライクなスタイルで書くことができる。

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

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

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

とも書ける。

マクロの例[編集]

マクロは、プログラム中に繰り返し出現するコードをコンパイル直前に生成する機能である。

データベースへのアクセス[編集]

例えば、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" %>

P/Invoke[編集]

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();
    }
}

外部リンク[編集]