はじめてのNemerleその1

Nemerleは.NETプラットフォーム向けのプログラミング言語です。近年、オブジェクト指向言語が主流となっていますが、Nemerleオブジェクト指向に対応していますが、それに関数型言語の特徴も併せ持ったハイブリッド言語となっています。Nemerleという名称はちょっと読みにくいですが、恐らくネマールだと思います。元ネタはゲド戦記の大賢人ネマール(Nemmerle)らしいのですが、ゲド戦記は読んだことありません。(^^;

Nemerleの特徴は、

などが挙げられ、C#と同様.NETプラットフォーム向けに設計された言語なので、言語仕様がスッキリしていると思います。また、特徴の一つの関数型言語については、F#というOcamlの流れを汲む言語があるのですが、Nemerleの表記はC#に近いので関数型言語の中では親しみやすいです。

では早速、Nemerleでの最初のコードを見てみます。

using System;

class App 
{
    public static Main() : void
    {
        Console.WriteLine("Hello Nermele");
    }
}

・・・ほとんどC#と変わりませんね。この程度のプログラムだと差は付きませんよね。「Hello, World」ならPerlRubyも同じですし(^^;
ただ、この例には1カ所だけC#では通らないところがあります。関数の定義ですが、戻り値が:(コロン)を置いて型となっています。これでピンと来た人もいると思いますが、Pascal形式になっています。続いてもう少し複雑な関数を見てみましょう。

Fib(n : int) : int
{
  mutable a <- 0;
  mutable b <- 1;

  for (mutable i <- 1; i < n; i <- i + 1)
  {
    def tmp = a + b;
    a <- b;
    b <- tmp;
  };
  b;
}

いい加減ワンパターンですが、フィボナッチ関数です。これならC#とは区別が付きますね。まずは見慣れないmutableですが、これは変数を意味します。そのすぐ隣にある<-は代入の記号となっています。言語設計者としては=(イコール)が代入と等号の両方の意味で、ルーズに使われているのが好ましくないようでNemerleでは両者を区別します。続いてdef。これは定義なので=(イコール)を使用しています。defで宣言された変数(というのもおかしいですが)はmutableと違ってimmutable(変更不可)となっています。
あと、分からないのは関数最後のb。ところでFib関数の戻り値がintなのにreturnが無いですよね。そうです、Nemerleは最後に評価された値が戻り値になります。この辺はRubyとかと一緒。あっ、最後に一点、Nemerleではブロックの最後に;(セミコロン)が必要です。結構忘れやすいので注意かも。(forブロックに注目)

ここまでのところ、既存の言語に比べて見た目の表記が違うだけにしか見えません。これではちょっと寂しいので、もう少し違いの分かる例を見てみたいと思います。

public fib(n : int) : int
{
  def fib_iter(a : int, b : int,  count : int) : int
  {
    if (count == 0)
      b
    else
      fib_iter(a + b, a, count - 1)
  };
  fib_iter(1, 0, n);
}

またしてもフィボナッチ関数ですが、今度はちょっと様子が違います。fib_iterに注目。見ての通り、Nemerleはローカル関数をサポートしていますが、それよりもループが無くなっていることに気づきましたでしょうか?fib_iter再帰呼び出しになっていて、終了条件count == 0が満たされるまで再帰され続けます。このように関数型言語はループを再帰によって実現します・・・で終わると再帰くらい他の言語でもやるぞ!とか、こんなのパフォーマンス悪くて使ってられねーよ!とか言われそうなので、続き。実は問題ありません。Nemerleでは末尾再帰の最適化が行われます。関数本体の最後で再帰呼び出しする場合、スタックを使い回すので、例え1億回再帰呼び出しを行っても平気だったりします。念のため、forと再帰呼び出しとでパフォーマンステストをしてみましたが、ほぼ同じ速度でした。一方、C#再帰呼び出しを行うと、すぐにスタックオーバーフローを起こしてしまいます。

ハイブリット言語っぽいところを(ほんのちびっと)紹介できたので、今日はここでおしまいです。(^^; 次に機会があれば、ラムダ式型推論について触れたいと思います。


Nemerleのインストールはここから、MSI packages(win32版)をダウンロードしてダブルクリックでOKです。(^^;