Nemerle
パラダイムマルチパラダイム: 関数型、オブジェクト指向、命令型
設計者Kamil Skalski、Micha? Moskal、Prof. Leszek Pacholski、Pawe? Olszta
最新リリース0.9.3 / 2006年
型付け強い静的型付け、型推論あり
主な処理系.NET Framework、Mono他
影響を受けた言語ML、C#
ライセンスGPL
ウェブサイト ⇒www.nemerle.org
表・話・編・歴
Nemerle(ネマール)は.NETプラットフォーム上で動作する静的型付けの高級言語である。
Wroc?aw University(ポーランド)のKamil Skalski、Micha? Moskal、Prof. Leszek Pacholski、Pawe? Olsztaらによって開発された。手続き型、オブジェクト指向、関数型言語の機能を取り込んだハイブリッド言語である。
C#によく似た構文構造と強力なメタプログラミング機能が特徴となっている。
目次
1 特徴
2 例
2.1 Hello, World!
2.2 マクロの例
2.2.1 データベースへのアクセス
2.2.2 新しい言語の実装
2.3 NemerleとASP.NET
2.4 P/Invoke
3 外部リンク
//
おそらくNemerleの最も重要な特徴は、オブジェクト指向プログラミングと関数型プログラミングの両方を混在可能であるということであろう。プログラムのトップレベルではオブジェクト指向の構造を用いるが、メソッド本体には関数型のスタイルを用いることもできる。これは幾つかのプログラムにおいて非常に便利に機能する。またデリゲートやバリアント型、パターンマッチングなどの機能を含む。
別の特徴として、プログラマの負担を軽減するためにハイレベルなアプローチを取っていることも挙げられる。マクロや型推論などの特徴がそれに該当する。
関数型言語の世界から取り入れられた機能は、バリアント(代数的データ型)、パターンマッチング、型推論、そしてパラメータ的多態(ジェネリクス)などである。メタプログラミングシステムは高度なコンパイラ拡張、ドメイン固有言語の組み込み、部分評価、アスペクト指向プログラミングなどを許容する。
また、.NETの機能をC#と同じくらい(あるいはそれ以上に)簡単に扱うことも可能である。
伝統的な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上に直接組み込むことが可能である。<%@ 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(); }}