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) { 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; }