binary-tree bentchmark

Nemerleに移植してみました。
結果は、

[Nemerle+Mono1.1.14]
real    0m1.454s
user    0m0.015s
sys     0m0.015s

[Nemerle+.NET2.0
real    0m0.859s
user    0m0.015s
sys     0m0.016s

静的な型だと流石に速いです。実はコードが間違っているというオチはないですよね?(^^;

Nemerleのコードは以下の通り。

using System;
using Nemerle.IO;

variant Tree { | Node { left : Tree; item : int; right: Tree; } | Empty }

def make (i, d) {
    | (_, 0) => Tree.Empty()
    | _ => def i2 = 2 * i; def d2 = d - 1; 
        Tree.Node(make(i2 - 1, d2), i, make (i2, d2));
}

def check(_) {
    | Tree.Empty => 0 | Tree.Node(l, i, r) => i + check(l) - check(r)
}

def argv = Environment.GetCommandLineArgs();
def min_depth = 4;
def max_depth = Math.Max(min_depth + 2, int.Parse(argv[1]));
def stretch_depth = max_depth + 1;

printf("stretch tree of depth %d\t check: %d\n", 
        stretch_depth, check(make(0, stretch_depth)));

def long_lived_tree = make(0, max_depth);

foreach (depth in $[min_depth, min_depth+2 .. stretch_depth-1]) {
    def iterations = 1 << (max_depth - depth + min_depth);
    mutable c = 0;
    foreach (i in $[1 .. iterations]) 
        c += check(make(i, depth)) + check(make(-i, depth)); 
    printf("%d\t trees of depth %d\t check: %d\n", iterations * 2, depth, c);
}
printf("long lived tree of depth %d\t check: %d\n", 
        max_depth, check(long_lived_tree));

C#そっくりに書くことも出来ますが、ちょっとだけ関数型っぽいところを出してみました。