自由モノイドプログラミング言語の作成(MonIter バージョン1.2 仕様(20))
MonIter コードから C# コードに変換
引数で渡すバージョン
MonIter のコード
def fib(x, y) = x & fib(y, x + y);
fib(0, 1)を C# のコードに変換するには以下のようにします。
/// <summary> /// フィボナッチ数列 C# コード出力(引数あり) /// </summary> /// <returns>フィボナッチ数列の C# コード</returns> private string InfiniteFibpnacciPrmsCSCode() { string src = "def fib(x, y) = x & fib(y, x + y); fib(0, 1)"; Prog prog = MonParser.ParseProg(src); Func<string, string> perf = x => $"string.Join(\", \", {x}.Take({GetCount()}))"; return prog.GenerateCS(true, perf); }
結果は以下のようになります。
IEnumerable<int> fib(int x, int y) { yield return x; foreach (int e in fib(y, x + y)) { yield return e; } } string.Join(", ", fib(0, 1).Take(20))
Zip を使うバージョン
MonIter のコード
def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y)));
fib(0, 1)を C# のコードに変換するには以下のようにします。
/// <summary> /// フィボナッチ数列 C# コード出力(Zip) /// </summary> /// <returns>フィボナッチ数列の C# コード</returns> private string InfiniteFibpnacciZipCSCode() { string src = "def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y))); fib(0, 1)"; Prog prog = MonParser.ParseProg(src); Func<string, string> perf = x => $"string.Join(\", \", {x}.Take({GetCount()}))"; string zipsum_src = "IEnumerable<int> zipsum(IEnumerable<int> mon1, IEnumerable<int> mon2)\r\n{\r\n return mon1.Zip(mon2, (x, y) => x + y);\r\n}\r\n"; string tail_src = "IEnumerable<int> tail(IEnumerable<int> mon)\r\n{\r\n return mon.Skip(1);\r\n}\r\n"; return zipsum_src + tail_src + prog.GenerateCS(true, perf); }
結果は以下のようになります。
IEnumerable<int> zipsum(IEnumerable<int> mon1, IEnumerable<int> mon2) { return mon1.Zip(mon2, (x, y) => x + y); } IEnumerable<int> tail(IEnumerable<int> mon) { return mon.Skip(1); } IEnumerable<int> fib(int x, int y) { yield return x; yield return y; foreach (int e in zipsum(fib(x, y), tail(fib(x, y)))) { yield return e; } } string.Join(", ", fib(0, 1).Take(20))





