コード例 #1
0
ファイル: Runtime.cs プロジェクト: goking/ioke
        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);
            }
        }
コード例 #2
0
ファイル: Runtime.cs プロジェクト: goking/ioke
        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);
            }
        }