public override Tuple<ABT.Env, ABT.Stmt> GetStmt(ABT.Env env) {
Option<ABT.Expr> init = this.Init.Map(_ => _.GetExpr(env));
if (init.IsSome) {
env = init.Value.Env;
}
Option<ABT.Expr> cond = this.Cond.Map(_ => _.GetExpr(env));
if (cond.IsSome) {
env = cond.Value.Env;
}
if (cond.IsSome && !cond.Value.Type.IsScalar) {
throw new InvalidOperationException("Error: conditional expression in while Loop must be scalar.");
}
Option<ABT.Expr> loop = this.Loop.Map(_ => _.GetExpr(env));
if (loop.IsSome) {
env = loop.Value.Env;
}
Tuple<ABT.Env, ABT.Stmt> r_body = this.Body.GetStmt(env);
env = r_body.Item1;
ABT.Stmt body = r_body.Item2;
return new Tuple<ABT.Env, ABT.Stmt>(env, new ABT.ForStmt(init, cond, loop, body));
}