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; }
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) { 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) { 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(valueStack.Pop() is Symbol); 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((char)(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) { 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) { 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 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(); 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) { 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; }