Expr IStatementVisitor <Expr> .Visit(Statement.For statement)
{
var parentScope = scope;
scope = Scope.CreateChild(parentScope);
var step = statement.Step == null
? new Expression.Number(1.0).Visit(this)
: ExprHelpers.ConvertToNumber(context, statement.Step.Visit(this));
var loopVariable = scope.AddLocal(statement.Identifier);
var varVar = Expr.Variable(typeof(double));
var limitVar = Expr.Variable(typeof(double));
var stepVar = Expr.Variable(typeof(double));
var breakConditionExpr = ForLoopBreakCondition(limitVar, stepVar, varVar);
var expr =
Expr.Block(
new[] { loopVariable, varVar, limitVar, stepVar },
Expr.Assign(varVar, ExprHelpers.ConvertToNumber(context, statement.Var.Visit(this))),
Expr.Assign(limitVar, ExprHelpers.ConvertToNumber(context, statement.Limit.Visit(this))),
Expr.Assign(stepVar, step),
ExprHelpers.CheckNumberForNan(varVar, String.Format(ExceptionMessage.FOR_VALUE_NOT_NUMBER, "inital value")),
ExprHelpers.CheckNumberForNan(limitVar, String.Format(ExceptionMessage.FOR_VALUE_NOT_NUMBER, "limit")),
ExprHelpers.CheckNumberForNan(stepVar, String.Format(ExceptionMessage.FOR_VALUE_NOT_NUMBER, "step")),
ForLoop(statement, stepVar, loopVariable, varVar, breakConditionExpr));
scope = parentScope;
return(expr);
}