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

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

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

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

構文要素に対応するクラス(Number クラス:数値を表す)

    /// <summary>
    /// 数値を表すクラス
    /// </summary>
    internal class Number : DomainExpression
    {
        /// <summary>
        /// 数値を表す整数
        /// </summary>
        private readonly int number;
        /// <summary>
        /// 文字列から数値を作成するコンストラクター
        /// </summary>
        /// <param name="number_string">数値を表す文字列</param>
        public Number(string number_string)
        {
            number = int.Parse(number_string);
        }
        /// <summary>
        /// 整数から数値を作成するコンストラクター
        /// </summary>
        /// <param name="number">数値を表す整数</param>
        public Number(int number)
        {
            this.number = number;
        }
        /// <summary>
        /// 0 を表す
        /// </summary>
        public static Number Zero {  get { return new Number(0); } }
        /// <summary>
        /// 数値を表す整数を取得する
        /// </summary>
        public int Number_ => number;
        /// <summary>
        /// 式を評価して無限自由モノイドの値を取得します。
        /// </summary>
        /// <param name="env">引数の値が記録されています。</param>
        /// <returns>式の値(無限自由モノイド)</returns>
        public Number Eval(Env<FreeMonoidUnion> env)
        {
            return this;
        }
        /// <summary>
        /// 数値の符号を変える
        /// </summary>
        /// <param name="num">数値</param>
        /// <returns>数値の符号を変えた数(反数)</returns>
        public static Number operator -(Number num)
        {
            return new Number(-num.number);
        }
        /// <summary>
        /// 数値の加法
        /// </summary>
        /// <param name="left">第一の数値</param>
        /// <param name="right">第二の数値</param>
        /// <returns>数値の和</returns>
        public static Number operator +(Number left, Number right)
        {
            return new Number(left.number + right.number);
        }
        /// <summary>
        /// 数値の減法
        /// </summary>
        /// <param name="left">第一の数値</param>
        /// <param name="right">第二の数値</param>
        /// <returns>数値の差</returns>
        public static Number operator -(Number left, Number right)
        {
            return new Number(left.number - right.number);
        }
        /// <summary>
        /// 数値の乗法
        /// </summary>
        /// <param name="left">第一の数値</param>
        /// <param name="right">第二の数値</param>
        /// <returns>数値の積</returns>
        public static Number operator *(Number left, Number right)
        {
            return new Number(left.number * right.number);
        }
        /// <summary>
        /// 数値の除法
        /// </summary>
        /// <param name="left">第一の数値</param>
        /// <param name="right">第二の数値</param>
        /// <returns>数値の商</returns>
        public static Number operator /(Number left, Number right)
        {
            return new Number(left.number / right.number);
        }
        /// <summary>
        /// 数値の除法の余り(剰余)
        /// </summary>
        /// <param name="left">第一の数値(被除数)</param>
        /// <param name="right">第二の数値(除数)</param>
        /// <returns>数値の剰余</returns>
        public static Number operator %(Number left, Number right)
        {
            return new Number(left.number % right.number);
        }
        /// <summary>
        /// 式を MonIter のコードの文字列に変換して取得します。
        /// </summary>
        /// <returns>MonIter のコードの文字列</returns>
        public string Print()
        {
            return number.ToString();
        }
        /// <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)
        {
            if (yieldp)
            {
                return $"yield {number}\r\n";
            }
            else
            {
                return $"{number}";
            }
        }
        /// <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)
        {
            if (yieldp)
            {
                return $"yield return {number};\r\n";
            }
            else
            {
                return $"{number}";
            }
        }
    }