/// <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()); }
public override GrassFunc Clone() { GrassFunc newFunc = Condition(_Which, _CurrentArgNumber); newFunc.CopyFuncStack(_FuncStack); return(newFunc); }
protected override GrassFunc Curry(GrassFunc arg) { GrassProjection2 newFunc = new GrassFalse(_CurrentArgNumber + 1); newFunc.CopyFuncStack(_FuncStack); newFunc.Push(arg); return(newFunc); }
protected override GrassFunc Curry(GrassFunc func) { GrassMyFunc newFunc = new GrassMyFunc(_ArgNumberMax, _CurrentArgNumber + 1, _SentenceList); newFunc.CopyFuncStack(_FuncStack); newFunc.Push(func); return(newFunc); }
/// <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)); } }
protected override GrassFunc Curry(GrassFunc func) { GrassMyFunc newFunc = new GrassMyFunc(_ArgNumberMax, _CurrentArgNumber + 1, _SentenceList); newFunc.CopyFuncStack(_FuncStack); newFunc.Push(func); return newFunc; }
/// <summary> /// 関数のカリー化 /// </summary> /// <param name="arg"></param> /// <returns></returns> protected virtual GrassFunc Curry(GrassFunc arg) { throw new NotImplementedException(); }
/// <summary> /// 関数の実行 /// </summary> /// <param name="func"></param> /// <returns></returns> protected abstract GrassFunc Perform(GrassFunc arg);
/// <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); } }
/// <summary> /// 関数をスタックにプッシュ /// </summary> /// <param name="func"></param> public void Push(GrassFunc func) { _FuncStack.Push(func); }
protected override GrassFunc Curry(GrassFunc arg) { GrassProjection2 newFunc = new GrassTrue(_CurrentArgNumber + 1); newFunc.CopyFuncStack(_FuncStack); newFunc.Push(arg); return newFunc; }
/// <summary> /// Falseなので引数2(<paramref name="arg"/>)を常に返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { return(arg); }
/// <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; }
/// <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 ); }
/// <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 )); }
protected override abstract GrassFunc Perform(GrassFunc arg);
/// <summary> /// 実行 /// <para></para>引数の値(文字コード)の文字を標準出力し、引数をそのまま返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { Console.Write((char)arg.Value); return(arg); }
/// <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); }
/// <summary> /// 実行 /// <para></para>引数の値(文字コード)が同じならTrue関数、違うならFalse関数を返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { return(GrassProjection2.Condition(Value == arg.Value)); }
/// <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(); }
protected abstract override GrassFunc Perform(GrassFunc arg);
/// <summary> /// Falseなので引数2(<paramref name="arg"/>)を常に返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { return arg; }
/// <summary> /// Trueなので引数1(スタック先頭)を常に返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { return _FuncStack.Peek(); }
/// <summary> /// Trueなので引数1(スタック先頭)を常に返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { return(_FuncStack.Peek()); }
/// <summary> /// 実行 /// <para></para>引数の値(文字コード)の文字を標準出力し、引数をそのまま返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { Console.Write((char)arg.Value); return arg; }
/// <summary> /// 実行 /// <para></para>引数の値(文字コード)が同じならTrue関数、違うならFalse関数を返す /// </summary> /// <param name="arg"></param> /// <returns></returns> protected override GrassFunc Perform(GrassFunc arg) { return GrassProjection2.Condition(Value == arg.Value); }