internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object tos = valueStack.Pop(); object under_tos = valueStack.Pop(); valueStack.Push(operation(tos, under_tos)); ip += Length; }
public object Run(params object[] parameters) { var envStack = new EnvironmentStack(); envStack.PushNew(); // Global env envStack.Set(Symbol.fromString("sys:args"), new Variable(CliToVm(parameters))); int ip = 0; var valueStack = new ValueStack(); var callStack = new CallStack(); for (var current = Statements[ip]; !(current is EndStatement); current = Statements[ip]) { //System.Diagnostics.Debug.Print("0x" + ip.ToString("x4") + ": " + current); current.Execute(ref ip, valueStack, envStack, callStack); } if (envStack.Count() == 0) throw new exceptions.RuntimeException("Bad program: Global environment deleted!"); if (envStack.Count() > 1) throw new exceptions.RuntimeException("Bad program: Environment stack not cleaned up"); if (callStack.Count() > 1) throw new exceptions.RuntimeException("Bad program: Call stack not cleaned up"); if (valueStack.Count() == 0) throw new exceptions.RuntimeException("Bad program: Value stack empty after running"); if (valueStack.Count() > 1) throw new exceptions.RuntimeException("Bad program: Value stack not cleaned up"); return valueStack.Pop(); }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { if (callStack.GetLastNumberOfParameters() != NumberOfParameters) throw new exceptions.RuntimeException(Symbol + ": Invalid parameter count"); envStack.PushNew(); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object o = valueStack.Pop(); if (o is Variable) envStack.Set(Symbol, (Variable)o); // Link to variable, e.g. in Closure else { if (envStack.HasVariable(Symbol)) envStack.Get(Symbol).SetValue(o); else envStack.Set(Symbol, new Variable(o)); } ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { int provided = callStack.GetLastNumberOfParameters(); if (provided < NumberOfParameters - 1) // -1 as there may be an empty list as rest parameter throw new exceptions.RuntimeException(Symbol + ": Invalid parameter count"); object restParameter = Nil.GetInstance(); for (int i = 0; i < NumberOfParametersToSkip; ++i) skipStack.Push(valueStack.Pop()); int numberOfValuesForRestParameter = 1 + provided - NumberOfParameters; for (int i = 0; i < numberOfValuesForRestParameter; ++i) restParameter = new Pair(valueStack.Pop(), restParameter); valueStack.Push(restParameter); for (int i = 0; i < NumberOfParametersToSkip; ++i) valueStack.Push(skipStack.Pop()); envStack.PushNew(); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(new IP(Number)); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(((Pair)valueStack.Pop()).Second); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push((char)(int)valueStack.Pop()); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(valueStack.Pop() is Symbol); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { char c = (char)valueStack.Pop(); int index = (int)valueStack.Pop(); StringObject str = (StringObject)valueStack.Pop(); str.SetCharAt(index, c); valueStack.Push(c); ip += Length; }
internal abstract void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack);
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { envStack.Pop(); ip = callStack.GetLastIp(); callStack.Pop(); }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object o = valueStack.Pop(); envStack.Get(Symbol).SetValue(o); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object o = valueStack.Pop(); valueStack.Push(random.Next(Convert.ToInt32(o))); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(envStack.Get(Symbol).GetValue()); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(Nil.GetInstance()); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { throw new exceptions.RuntimeException("Error in program: Jump into the middle of a statement"); }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(Symbol.fromString(((StringObject)valueStack.Pop()).Value)); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object o = valueStack.Pop(); if (o is bool && (bool)o == false) ip = Target; else ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { ip = Target; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object o = valueStack.Pop(); valueStack.Push(o is int || o is double); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { valueStack.Push(new StringObject((int)valueStack.Pop())); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { int end = (int)valueStack.Pop(); int start = (int)valueStack.Pop(); StringObject str = (StringObject)valueStack.Pop(); valueStack.Push(new StringObject(str.Value.Substring(start, end - start))); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { object o = valueStack.TopOfStack(); if (o is bool) printer.Print(((bool)o) ? "#t" : "#f"); else printer.Print(string.Format(CultureInfo.InvariantCulture, "{0}", o)); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { List<Variable> values = new List<Variable>(); for (int i = 0; i < NumberOfPushedArguments; ++i) { Symbol symbol = (Symbol)valueStack.Pop(); values.Add(envStack.Get(symbol)); } values.Reverse(); valueStack.Push(new Closure((IP)valueStack.Pop(), values)); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { envStack.Pop(); int oldIp = callStack.GetLastIp(); callStack.Pop(); object target = valueStack.GetFromTop(NumberOfPushedArguments); if (target is IP) { callStack.Push(oldIp, NumberOfPushedArguments); ip = ((IP)target).Value; return; } if (target is Closure) { Closure c = (Closure)target; foreach (var value in c.ClosedOverValues) valueStack.Push(value); callStack.Push(oldIp, NumberOfPushedArguments + c.ClosedOverValues.Count); ip = c.Target; return; } throw new exceptions.RuntimeException("Invalid CALL target"); }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { envStack.Set(Symbol, new Variable()); ip += Length; }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { throw new exceptions.Error(valueStack.Pop()); }