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); } }
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)); }
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)); } }
public static void PopAndAppendCode(Forth f) { ExecutionToken xt = f.PopExecutionToken(); f.AppendCode(xt); }
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)); } }
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); }
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)); }
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(); } ); }
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(); } ); }
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)); }
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); } ); }
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)); }
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)); }
public static void Ahead(Forth f) { f.CodeBeingCompiled.RefForward(f); f.AppendCode(new ExecutionToken(Jump)); }
public static void Again(Forth f) { f.CodeBeingCompiled.RefBack(f); f.AppendCode(new ExecutionToken(Jump)); }
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); }; } ); } ) ); }