ものがたり(旧)

atsushieno.hatenablog.com に続く

cs2n

Nemerleでコードを考えると、breakやreturnでけっこう悩みます(苦笑)。関数型言語なので、再帰でどーにかするっていうのが正しいアプローチだとは思うのですが、それなりにC#に似ているだけに、どうしてもC#っぽいものを期待してしまうわけです。まあJavaのコードをC#に移植していても、break blahblah;がほしいなーとか思ってしまうわけですがw*1

ところで最新のNemerleにはcs2nというコード変換ツールが付いてきます。これだとループ中のreturnに対して、どんなコードを生成してくれるんでしょうか。meiさんのコードで試しにやってみました。

C#コード:


using System;

public class Test
{
int n = 1;
int [] lhs = new int [] {1,2,3};
int [] rhs = new int [] {1,2,3};
public static void Main ()
{
Console.WriteLine (new Test ().Foo ());
}
private int Foo ()
{
for (int i = 0; i < n; ++i) {
if (lhs [i] != rhs [i])
return i;
}
return n;
}
}

$ cs2n mei-nem.cs

生成されたNemerleコード


using System;

public class Test
{
mutable n : int = 1;
mutable lhs : array [int] = array[1,2,3];
mutable rhs : array [int] = array[1,2,3];
public static Main () : void
{
Console.WriteLine ( Test ().Foo ());
}
private Foo () : int
{
{
mutable temp_2_return_ = Nemerle.Extensions.DefaultValue(int);
mutable temp_1_break_loop_ = false;
for (mutable i = 0; i < n && !temp_1_break_loop_; ++i) {
when (lhs [i] != rhs [i])
{
temp_1_break_loop_ = true;
temp_2_return_ = i;
}
}
if( temp_1_break_loop_ )
{
temp_2_return_;
}
else
{
{
n;
}
}
}
}
}

うーん、まあそういうことですよね…^^;

全然関係ないですがnemerleのビルドって何つーか美しいですよねぇ。見てて楽しくなっちゃいます。

*1:gotoでいいじゃん、っていうフローブランチング最適化なんて無視無視なツッコミは梨のつぶてでお願いします^^;