private static bool ExactlyOnce(object[] args, TextBuffer output, BindingEnvironment env, MethodCallFrame predecessor, Step.Continuation k) { ArgumentCountException.Check("ExactlyOnce", 1, args); TextBuffer finalOutput = output; BindingList <LogicVariable> finalBindings = null; State finalState = State.Empty; MethodCallFrame finalFrame = predecessor; bool failure = true; var chain = Step.ChainFromBody("ExactlyOnce", args); chain.Try(output, env, (o, u, d, p) => { failure = false; finalOutput = o; finalBindings = u; finalState = d; finalFrame = p; return(true); }, predecessor); if (failure) { var failedCall = (Call)chain; throw new CallFailedException(env.Resolve(failedCall.Task), env.ResolveList(failedCall.Arglist)); } return(k(finalOutput, finalBindings, finalState, finalFrame)); }
/// <summary> /// Attempt to run this task /// </summary> /// <param name="output">Output to which to write text</param> /// <param name="env">Variable binding information</param> /// <param name="k">Continuation to call at the end of this step's step-chain</param> /// <param name="predecessor">Predecessor frame</param> /// <returns>True if this steps, the rest of its step-chain, and the continuation all succeed.</returns> public override bool Try(TextBuffer output, BindingEnvironment env, Continuation k, MethodCallFrame predecessor) { MethodCallFrame.CurrentFrame = env.Frame; var target = env.Resolve(Task); var arglist = env.ResolveList(Arglist); return(CallTask(output, env, k, target, arglist, target, predecessor)); }
/// <inheritdoc /> public override bool Call(object[] arglist, TextBuffer output, BindingEnvironment env, MethodCallFrame predecessor, Step.Continuation k) => implementation(env.ResolveList(arglist), output, env, predecessor, k);