非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

自由モノイドのイテレーター(36)

自由モノイドプログラミング言語の作成(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))