Nemerle
Nemerle(ネマール)は.NETプラットフォーム
パラダイム |
マルチパラダイム: |
---|---|
Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszta | |
1.2.547.0/ 2017 | |
| |
.NET Framework、Mono | |
ML、C# | |
ライセンス | BSD Like License |
ウェブサイト | www.nemerle.org |
Wrocław University(ポーランド)のKamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olsztaらによって
特徴
おそらくNemerleの
強 い型 推論 - マクロによる
柔軟 なメタプログラミング - (C#やJava、C++のような
文法 の)オブジェクト指向 プログラミング - (ML、OCaml、Haskellのような
文法 の)関数 型 プログラミングの諸 機能 :
メタプログラミング
また、ジェネリックプログラミングやラムダや
型 推論
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 のマクロ
"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に
また、SharpDevelop
アドインによりVisual Studio 2010にも
例
Hello, World!
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)"; // $(...) を使 うことで複雑 な式 も展開 できる
コード生成
StructuralEquality、Memoize、json、withなどはコンパイル
[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();
}
}
データベースへのアクセス
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();
これは、ライブラリ
新 しい言語 の実装
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はネイティブのプラットフォームライブラリを
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();
}
}
参照
- ^ “Twitter / orangy: We've decided to bring Nemerle”. Twitter.com. 2013
年 9月 5日 閲覧 。 - ^ “JetBrains .NET Tools Blog » JetBrains and Nemerle”. Blogs.jetbrains.com (2012
年 6月 27日 ). 2013年 9月 5日 閲覧 。 - ^ “Google Discussiegroepen”. Groups.google.com. 2013
年 9月 5日 閲覧 。 - ^ Nemerle Studio Microsoft Setup Installer can be installed after installation of Visual Studio Shell 2008 Isolated
参考
- Publications about Nemerle in RSDN Magazine, Russian official science magazine
- Moskal, Michał (27 June 2005). Type Inference with Deferral. Institute of Computer Science, University of Wrocław .
- Presentation "Nemerle is notable" by Denis Rystsov
- Article "Unconventional languages for unconventional supercomputers" by Andrey Adinetz