public void WithReturningRestart(string name, IokeObject context, RunnableWithControlFlow code) { IokeObject rr = IokeObject.As(Interpreter.Send(this.mimicMessage, context, this.Restart), context); IokeObject.SetCell(rr, "name", GetSymbol(name), context); IokeObject.SetCell(rr, "argumentNames", NewList(new SaneArrayList()), context); IList<RestartInfo> rrs = new SaneList<RestartInfo>(); BindIndex index = GetBindIndex(); rrs.Insert(0, new RestartInfo(name, rr, rrs, index, null)); index = index.NextCol(); RegisterRestarts(rrs); try { code(); } catch(ControlFlow.Restart e) { if(e.GetRestart.token == rrs) { return; } else { throw e; } } finally { UnregisterRestarts(rrs); } }
public object WithRestartReturningArguments(RunnableWithControlFlow code, IokeObject context, params Restart.NativeRestart[] restarts) { IList<RestartInfo> rrs = new SaneList<RestartInfo>(); BindIndex index = GetBindIndex(); foreach(Restart.NativeRestart rjr in restarts) { IokeObject rr = IokeObject.As(Interpreter.Send(this.mimicMessage, context, this.Restart), context); IokeObject.SetCell(rr, "name", GetSymbol(rjr.Name), context); IList args = new SaneArrayList(); foreach(string argName in rjr.ArgumentNames) { args.Add(GetSymbol(argName)); } IokeObject.SetCell(rr, "name", GetSymbol(rjr.Name), context); IokeObject.SetCell(rr, "argumentNames", NewList(args), context); string report = rjr.Report(); if(report != null) { IokeObject.SetCell(rr, "report", EvaluateString("fn(r, \"" + report + "\")", this.Message, this.Ground), context); } rrs.Insert(0, new RestartInfo(rjr.Name, rr, rrs, index, rjr)); index = index.NextCol(); } RegisterRestarts(rrs); try { code(); return new SaneArrayList(); } catch(ControlFlow.Restart e) { RestartInfo ri = null; if((ri = e.GetRestart).token == rrs) { Restart.NativeRestart currentRjr = (Restart.NativeRestart)ri.data; IokeObject result = currentRjr.Invoke(context, e.Arguments); return result; } else { throw e; } } finally { UnregisterRestarts(rrs); } }