public override RuntimeValueWrapper Execute(DoExpression e, RuntimeContext context) { RuntimeValueWrapper result = null; RuntimeContext newContext = new RuntimeContext() { PreviousContext = context }; foreach (Expression expression in e.Expressions) { VarExpression var = expression as VarExpression; if (var == null) { expression.BuildContext(newContext); result = expression.Execute(newContext); } else { result = new RuntimeValueWrapper(new RuntimeUnevaluatedValue(var.Expression), context); if (!var.Pattern.Match(context, result)) { throw new Exception("模式匹配不成功。"); } } } if (result == null) { return(RuntimeValueWrapper.CreateValue(new object())); } else { return(result); } }
public static RuntimeValueWrapper ReturnStateMonadValue(RuntimeValueWrapper[] arguments) { return(RuntimeValueWrapper.CreateValue(new StatePackage() { result = arguments[0], state = arguments[1] })); }
public override RuntimeValueWrapper Execute(RuntimeContext context) { return(RuntimeValueWrapper.CreateValue( Elements .Take(Elements.Count - 1) .Select(e => new RuntimeValueWrapper(new RuntimeUnevaluatedValue(e), context)) .Union((RuntimeValueWrapper[])Elements.Last().Execute(context).RuntimeObject) .ToArray() )); }
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 override RuntimeValueWrapper Execute(DoExpression e, RuntimeContext context) { RuntimeContext newContext = new RuntimeContext() { PreviousContext = context }; foreach (Expression expression in e.Expressions) { expression.BuildContext(newContext); } if (e.Expressions.Count > 0) { return(new RuntimeValueWrapper(new RuntimeUnevaluatedValue(e.Expressions.Last()), newContext)); } else { return(RuntimeValueWrapper.CreateValue(new object())); } }
public override bool Match(RuntimeContext context, RuntimeValueWrapper valueWrapper) { if (!valueWrapper.IsInvokable) { RuntimeValueWrapper[] valueWrappers = valueWrapper.RuntimeObject as RuntimeValueWrapper[]; if (valueWrappers.Length >= Elements.Count - 1) { for (int i = 0; i < Elements.Count - 1; i++) { if (!Elements[i].Match(context, valueWrappers[i])) { return(false); } } return(Elements[Elements.Count - 1].Match( context, RuntimeValueWrapper.CreateValue(valueWrappers.Skip(Elements.Count - 1).ToArray()) )); } } return(base.Match(context, valueWrapper)); }
public override RuntimeValueWrapper Execute(RuntimeContext context) { return(RuntimeValueWrapper.CreateValue( Elements.Select(e => new RuntimeValueWrapper(new RuntimeUnevaluatedValue(e), context)).ToArray() )); }
public override RuntimeValueWrapper Execute(RuntimeContext context) { return(RuntimeValueWrapper.CreateValue(new Flag(Name))); }
public static ScriptingValue CreateValue(object o) { return(new ScriptingValue(RuntimeValueWrapper.CreateValue(o))); }
public virtual RuntimeValueWrapper Execute(RuntimeContext context) { return(RuntimeValueWrapper.CreateValue(new object())); }