コード例 #1
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void DotQuote(Forth f)
 {
     if (f.isCompiling)
     {
         string str = f.getWord('"');
         f.AppendCode
         (
             delegate(Forth g)
             {
                 Console.Write(str);
             }
         );
     }
     else
     {
         string str = f.getWord('"');
         Console.Write(str);
     }
 }
コード例 #2
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void BracketTick(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("bracket-tick is only valid when compiling");
     string word = f.getWord(' ');
     ForthDictionaryEntry fde = f.SearchVocabularies(word);
     if (fde == null) throw new InvalidOperationException("attempt to bracket-tick undefined word " + word);
     f.AppendCode(MakeLiteralOp(fde.Proc));
 }
コード例 #3
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void PfBytes(Forth f)
 {
     if (f.isCompiling)
     {
         string hex = f.getWord(' ');
         f.AppendCode(MakeLiteralOp(HexToBytes(hex)));
     }
     else
     {
         string hex = f.getWord(' ');
         f.dStack.Push(HexToBytes(hex));
     }
 }
コード例 #4
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void PopAndAppendCode(Forth f)
 {
     ExecutionToken xt = f.PopExecutionToken();
     f.AppendCode(xt);
 }
コード例 #5
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Postpone(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("postpone is only valid when compiling");
     string word = f.getWord(' ');
     ForthDictionaryEntry fde = f.SearchVocabularies(word);
     if (fde == null) throw new InvalidOperationException("attempt to postpone undefined word " + word);
     if (fde.IsImmediate)
     {
         f.AppendCode(fde.Proc);
     }
     else
     {
         f.AppendCode(MakeLiteralOp(fde.Proc));
         f.AppendCode(new ExecutionToken(PopAndAppendCode));
     }
 }
コード例 #6
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void UnsignedMinusLoop(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("u-loop is only valid when compiling");
     f.AppendCode(new ExecutionToken(RuntimeUMinusLoop));
     f.CodeBeingCompiled.LabelForward(f);
 }
コード例 #7
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Literal(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("literal is only valid when compiling");
     object value = f.dStack.Pop();
     f.AppendCode(MakeLiteralOp(value));
 }
コード例 #8
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Unloop(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("unloop is only valid when compiling");
     f.AppendCode
     (
         delegate(Forth g)
         {
             g.loopStack.Drop();
         }
     );
 }
コード例 #9
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Leave(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("leave is only valid when compiling");
     f.AppendCode
     (
         delegate(Forth g)
         {
             g.rStack.Top = g.loopStack.Top.LoopCodeEnd;
             g.loopStack.Drop();
         }
     );
 }
コード例 #10
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void QuestionDo(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("?do is only valid when compiling");
     f.CodeBeingCompiled.RefForward(f);
     f.AppendCode(new ExecutionToken(RuntimeQuestionDo));
 }
コード例 #11
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void LoopJ(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("j is only valid when compiling");
     f.AppendCode
     (
         delegate(Forth g)
         {
             g.PushInt64(g.loopStack[1].LoopCounter);
         }
     );
 }
コード例 #12
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void If(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("if / while is only valid when compiling");
     f.CodeBeingCompiled.RefForward(f);
     f.AppendCode(new ExecutionToken(JumpIfFalse));
 }
コード例 #13
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Until(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("until is only valid when compiling");
     f.CodeBeingCompiled.RefBack(f);
     f.AppendCode(new ExecutionToken(JumpIfFalse));
 }
コード例 #14
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Ahead(Forth f)
 {
     f.CodeBeingCompiled.RefForward(f);
     f.AppendCode(new ExecutionToken(Jump));
 }
コード例 #15
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Again(Forth f)
 {
     f.CodeBeingCompiled.RefBack(f);
     f.AppendCode(new ExecutionToken(Jump));
 }
コード例 #16
0
ファイル: Forth.cs プロジェクト: Sunlighter/SimpleForth
 public static void Does(Forth f)
 {
     if (!f.isCompiling) throw new InvalidOperationException("does> is only valid when compiling");
     f.compileStack.Push
     (
         new CompileState
         (
             new CompositeWord(),
             delegate(CompositeWord finishedWord)
             {
                 //System.Diagnostics.Debug.WriteLine("Finished does>");
                 f.AppendCode
                 (
                     delegate(Forth g)
                     {
                         //System.Diagnostics.Debug.WriteLine("Executing does> (setting up " + g.lastWordCompiled + ")");
                         string localLastWordCompiled = g.lastWordCompiled;
                         ForthDictionaryEntry fde = g.definitions.Dict[localLastWordCompiled];
                         ExecutionToken oldBehavior = fde.Proc;
                         fde.Proc = delegate(Forth h)
                         {
                             //System.Diagnostics.Debug.WriteLine("Executing behavior for " + localLastWordCompiled);
                             oldBehavior(h);
                             finishedWord.Run(h);
                         };
                     }
                 );
             }
         )
     );
 }