public ScriptingValue Invoke(ScriptingValue firstArgument, params ScriptingValue[] arguments) { RuntimeValueWrapper result = ValueWrapper.Invoke(firstArgument.ValueWrapper); foreach (ScriptingValue argument in arguments) { result = result.Invoke(argument.ValueWrapper); } return(new ScriptingValue(result)); }
public override RuntimeValueWrapper Execute(DoExpression e, RuntimeContext context) { Func <RuntimeValueWrapper[], RuntimeValueWrapper> monadFunction = arguments => { StatePackage result = new StatePackage() { result = null, state = arguments[0] }; RuntimeContext newContext = new RuntimeContext() { PreviousContext = context }; newContext.Values.Add("return", RuntimeValueWrapper.CreateFunction(ReturnStateMonadValue, 2)); foreach (Expression expression in e.Expressions) { VarExpression var = expression as VarExpression; if (var == null) { expression.BuildContext(newContext); result = RunStateMonad(new RuntimeValueWrapper(new RuntimeUnevaluatedValue(expression), newContext), result.state); } else { result = RunStateMonad(new RuntimeValueWrapper(new RuntimeUnevaluatedValue(var.Expression), newContext), result.state); if (!var.Pattern.Match(newContext, result.result)) { throw new Exception("模式匹配不成功。"); } } if (!(bool)continueFunction.Invoke(result.state).RuntimeObject) { break; } } if (result.result == null) { result.result = RuntimeValueWrapper.CreateValue(new object()); } return(RuntimeValueWrapper.CreateValue(result)); }; return(RuntimeValueWrapper.CreateFunction(monadFunction, 1)); }
public static StatePackage RunStateMonad(RuntimeValueWrapper monad, RuntimeValueWrapper state) { return(monad.Invoke(state).RuntimeObject as StatePackage); }