エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

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

自由モノイドプログラミング言語の作成(MonIter バージョン1.2 仕様(9))

構文要素に対応するクラス(DomainUnit クラス:数値を表す無限自由モノイドの項)

    /// <summary>
    /// 数値を表す無限自由モノイドの項:数値の式で構成されます。
    /// </summary>
    internal class DomainUnit : Term
    {
        /// <summary>
        /// 項を構成する数値の式
        /// </summary>
        private readonly DomainExpression expression;
        public DomainUnit(DomainExpression expression)
        {
            this.expression = expression;
        }
        /// <summary>
        /// 式を評価して無限自由モノイドの値を取得します。
        /// </summary>
        /// <param name="env">引数の値が記録されています。</param>
        /// <param name="prog">構文木の全体。関数の定義をここから取得します。</param>
        /// <returns>式の値(無限自由モノイド)</returns>
        public FreeMonoid<int> Eval(Env<FreeMonoidUnion> env, Prog prog)
        {
            return FreeMonoid<int>.Unit(expression.Eval(env).Number_);
        }
        /// <summary>
        /// 式を MonIter のコードの文字列に変換して取得します。
        /// </summary>
        /// <returns>MonIter のコードの文字列</returns>
        public string Print()
        {
            return expression.Print();
        }
        /// <summary>
        /// 式を Python のコードの文字列に変換して取得します。
        /// </summary>
        /// <param name="yieldp">yield を表示するかどうか</param>
        /// <param name="typep">型名を表示するかどうか</param>
        /// <param name="indp">インデントを表示するかどうか</param>
        /// <param name="indcount">インデントの個数</param>
        /// <param name="perf">式のステートメントの文字列を変換する関数</param>
        /// <returns>Python のコードの文字列</returns>
        public string GeneratePython(bool yieldp, bool typep, bool indp, int indcount, Func<string, string> perf)
        {
            string exp_str = expression.GeneratePython(false, typep, false, indcount, perf);
            if (yieldp)
            {
                return $"yield {exp_str}\r\n";
            }
            else
            {
                return $"{exp_str}";
            }
        }
        /// <summary>
        /// 式を C# のコードの文字列に変換して取得します。
        /// </summary>
        /// <param name="yieldp">yield return を表示するかどうか</param>
        /// <param name="typep">型名を表示するかどうか</param>
        /// <param name="indp">インデントを表示するかどうか</param>
        /// <param name="indcount">インデントの個数</param>
        /// <param name="perf">式のステートメントの文字列を変換する関数</param>
        /// <returns>C# のコードの文字列</returns>
        public string GenerateCS(bool yieldp, bool typep, bool indp, int indcount, Func<string, string> perf)
        {
            string exp_str = expression.GenerateCS(false, typep, false, indcount, perf);
            if (yieldp)
            {
                return $"yield return {exp_str};\r\n";
            }
            else
            {
                return $"{exp_str}";
            }
        }
    }