public IResult <Unit> Execute() { stack.Clear(); globalFrame = new GlobalFrame(); stack.Push(globalFrame); operations.Goto(0); running = true; while (!context.Cancelled() && operations.More && running) { if (operations.Current.If(out var operation)) { trace(operations.Address, () => operation.ToString()); var currentAddress = operations.Address; if (operation.Execute(this).ValueOrOriginal(out var result, out var original) && running && result.ClassName != "Void") { stack.Peek().Push(result); } else if (original.IfNot(out var anyException) && anyException.If(out var exception)) { if (Tracing) { context.PrintLine(table.Value.ToString()); } if (GetErrorHandler().If(out var address)) { stack.Peek().Push(new Failure(exception.Message)); operations.Goto(address); } else { return(failure <Unit>(exception)); } } if (operation.Increment && currentAddress == operations.Address) { operations.Advance(1); } }