Beispiel #1
0
        /// <summary>
        /// 実行
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        protected override GrassFunc Perform(GrassFunc arg)
        {
            //追加のローカルスタック
            Stack <GrassFunc> localStack = new Stack <GrassFunc>();

            localStack.Push(arg);
            foreach (var tuple in _SentenceList.Select((sentence, index) => new { sentence, index }))
            {
                if (tuple.sentence.CountUpperCaseW > tuple.index + 1 + _FuncStack.Count ||
                    tuple.sentence.CountLowerCaseW > tuple.index + 1 + _FuncStack.Count)
                {
                    System.Diagnostics.Debug.WriteLine("スタック内関数の指定は正常??");
                }
                GrassFunc funcApp = (tuple.sentence.CountUpperCaseW > tuple.index + 1) ?
                                    _FuncStack.Get(tuple.sentence.CountUpperCaseW - tuple.index - 2) :
                                    localStack.Get(tuple.sentence.CountUpperCaseW - 1);
                GrassFunc argApp = (tuple.sentence.CountLowerCaseW > tuple.index + 1) ?
                                   _FuncStack.Get(tuple.sentence.CountLowerCaseW - tuple.index - 2) :
                                   localStack.Get(tuple.sentence.CountLowerCaseW - 1);
                //GrassFunc func2 = (funcApp == argApp) ? funcApp.Clone() : funcApp;
                //localStack.Push(func2.Apply(argApp));
                localStack.Push(funcApp.Apply(argApp));
            }
            return(localStack.Peek());
        }
Beispiel #2
0
        public override GrassFunc Clone()
        {
            GrassFunc newFunc = Condition(_Which, _CurrentArgNumber);

            newFunc.CopyFuncStack(_FuncStack);
            return(newFunc);
        }
Beispiel #3
0
        protected override GrassFunc Curry(GrassFunc arg)
        {
            GrassProjection2 newFunc = new GrassFalse(_CurrentArgNumber + 1);

            newFunc.CopyFuncStack(_FuncStack);
            newFunc.Push(arg);
            return(newFunc);
        }
Beispiel #4
0
        protected override GrassFunc Curry(GrassFunc func)
        {
            GrassMyFunc newFunc = new GrassMyFunc(_ArgNumberMax, _CurrentArgNumber + 1, _SentenceList);

            newFunc.CopyFuncStack(_FuncStack);
            newFunc.Push(func);
            return(newFunc);
        }
Beispiel #5
0
 /// <summary>
 /// 関数の適用
 /// <para></para>引数が十分なときは実行し、
 /// <para></para>引数が足りないときはカリー化する
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 public GrassFunc Apply(GrassFunc arg)
 {
     if (_CurrentArgNumber + 1 == _ArgNumberMax)
     {
         return(Perform(arg));
     }
     else
     {
         return(Curry(arg));
     }
 }
Beispiel #6
0
 protected override GrassFunc Curry(GrassFunc func)
 {
     GrassMyFunc newFunc = new GrassMyFunc(_ArgNumberMax, _CurrentArgNumber + 1, _SentenceList);
     newFunc.CopyFuncStack(_FuncStack);
     newFunc.Push(func);
     return newFunc;
 }
Beispiel #7
0
 /// <summary>
 /// 関数のカリー化
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected virtual GrassFunc Curry(GrassFunc arg)
 {
     throw new NotImplementedException();
 }
Beispiel #8
0
 /// <summary>
 /// 関数の実行
 /// </summary>
 /// <param name="func"></param>
 /// <returns></returns>
 protected abstract GrassFunc Perform(GrassFunc arg);
Beispiel #9
0
 /// <summary>
 /// 関数の適用
 /// <para></para>引数が十分なときは実行し、
 /// <para></para>引数が足りないときはカリー化する
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 public GrassFunc Apply(GrassFunc arg)
 {
     if (_CurrentArgNumber + 1 == _ArgNumberMax)
     {
         return Perform(arg);
     }
     else
     {
         return Curry(arg);
     }
 }
Beispiel #10
0
 /// <summary>
 /// 関数をスタックにプッシュ
 /// </summary>
 /// <param name="func"></param>
 public void Push(GrassFunc func)
 {
     _FuncStack.Push(func);
 }
Beispiel #11
0
 protected override GrassFunc Curry(GrassFunc arg)
 {
     GrassProjection2 newFunc = new GrassTrue(_CurrentArgNumber + 1);
     newFunc.CopyFuncStack(_FuncStack);
     newFunc.Push(arg);
     return newFunc;
 }
Beispiel #12
0
 /// <summary>
 /// Falseなので引数2(<paramref name="arg"/>)を常に返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return(arg);
 }
Beispiel #13
0
 /// <summary>
 /// 実行
 /// <para></para>標準入力から1文字受け取り、正常な文字ならその文字の関数、異常なら引数をそのまま返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     char ch = (char)Console.Read();
     return char.IsLetter(ch) ? new GrassChar(ch) : arg;
 }
Beispiel #14
0
 /// <summary>
 /// 実行
 /// <para></para>引数の値の次(mod <see cref="MAX_CHAR_LENGTH"/>)の文字コードとなる文字関数を返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return new GrassChar(
         (arg.Value + 1) % MAX_CHAR_LENGTH
         );
 }
Beispiel #15
0
 /// <summary>
 /// 実行
 /// <para></para>引数の値の次(mod <see cref="MAX_CHAR_LENGTH"/>)の文字コードとなる文字関数を返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return(new GrassChar(
                (arg.Value + 1) % MAX_CHAR_LENGTH
                ));
 }
Beispiel #16
0
 protected override abstract GrassFunc Perform(GrassFunc arg);
Beispiel #17
0
 /// <summary>
 /// 実行
 /// <para></para>引数の値(文字コード)の文字を標準出力し、引数をそのまま返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     Console.Write((char)arg.Value);
     return(arg);
 }
Beispiel #18
0
        /// <summary>
        /// 実行
        /// <para></para>標準入力から1文字受け取り、正常な文字ならその文字の関数、異常なら引数をそのまま返す
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        protected override GrassFunc Perform(GrassFunc arg)
        {
            char ch = (char)Console.Read();

            return(char.IsLetter(ch) ? new GrassChar(ch) : arg);
        }
Beispiel #19
0
 /// <summary>
 /// 実行
 /// <para></para>引数の値(文字コード)が同じならTrue関数、違うならFalse関数を返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return(GrassProjection2.Condition(Value == arg.Value));
 }
Beispiel #20
0
 /// <summary>
 /// 実行
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     //追加のローカルスタック
     Stack<GrassFunc> localStack = new Stack<GrassFunc>();
     localStack.Push(arg);
     foreach (var tuple in _SentenceList.Select((sentence, index) => new { sentence, index }))
     {
         if (tuple.sentence.CountUpperCaseW > tuple.index + 1 + _FuncStack.Count ||
             tuple.sentence.CountLowerCaseW > tuple.index + 1 + _FuncStack.Count)
         {
             System.Diagnostics.Debug.WriteLine("スタック内関数の指定は正常??");
         }
         GrassFunc funcApp = (tuple.sentence.CountUpperCaseW > tuple.index + 1) ?
             _FuncStack.Get(tuple.sentence.CountUpperCaseW - tuple.index - 2) :
             localStack.Get(tuple.sentence.CountUpperCaseW - 1);
         GrassFunc argApp = (tuple.sentence.CountLowerCaseW > tuple.index + 1) ?
             _FuncStack.Get(tuple.sentence.CountLowerCaseW - tuple.index - 2) :
             localStack.Get(tuple.sentence.CountLowerCaseW - 1);
         //GrassFunc func2 = (funcApp == argApp) ? funcApp.Clone() : funcApp;
         //localStack.Push(func2.Apply(argApp));
         localStack.Push(funcApp.Apply(argApp));
     }
     return localStack.Peek();
 }
Beispiel #21
0
 /// <summary>
 /// 関数の実行
 /// </summary>
 /// <param name="func"></param>
 /// <returns></returns>
 protected abstract GrassFunc Perform(GrassFunc arg);
Beispiel #22
0
 protected abstract override GrassFunc Perform(GrassFunc arg);
Beispiel #23
0
 /// <summary>
 /// Falseなので引数2(<paramref name="arg"/>)を常に返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return arg;
 }
Beispiel #24
0
 /// <summary>
 /// Trueなので引数1(スタック先頭)を常に返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return _FuncStack.Peek();
 }
Beispiel #25
0
 /// <summary>
 /// Trueなので引数1(スタック先頭)を常に返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return(_FuncStack.Peek());
 }
Beispiel #26
0
 /// <summary>
 /// 実行
 /// <para></para>引数の値(文字コード)の文字を標準出力し、引数をそのまま返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     Console.Write((char)arg.Value);
     return arg;
 }
Beispiel #27
0
 /// <summary>
 /// 関数をスタックにプッシュ
 /// </summary>
 /// <param name="func"></param>
 public void Push(GrassFunc func)
 {
     _FuncStack.Push(func);
 }
Beispiel #28
0
 /// <summary>
 /// 実行
 /// <para></para>引数の値(文字コード)が同じならTrue関数、違うならFalse関数を返す
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected override GrassFunc Perform(GrassFunc arg)
 {
     return GrassProjection2.Condition(Value == arg.Value);
 }
Beispiel #29
0
 /// <summary>
 /// 関数のカリー化
 /// </summary>
 /// <param name="arg"></param>
 /// <returns></returns>
 protected virtual GrassFunc Curry(GrassFunc arg)
 {
     throw new NotImplementedException();
 }