public void VisitLeave(EachBlock astNode)
 {
     state.SetCursor(astNode);
     if (astNode.Type == EachBlock.LoopType.RunTime)
     {
         if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Index) || astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Last))
         {
             state.IncrementIndexVariable();
         }
         if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.First))
         {
             state.SetFirstVariable();
         }
         //Leave loop context
         state.ContextStack.Pop();
         state.LoopLevel--;
         var     prepareLoopStatements = SyntaxHelper.PrepareForLoop(astNode.Flags, state.LoopLevel + 1);
         Context context;
         if (astNode.Member.TryEvaluate(state, out context))
         {
             prepareLoopStatements.Add(SyntaxHelper.ForLoop(astNode.Member.EvaluateLoop(state).FullPath, context.FullPath, state.PopBlock()));
         }
         state.DoTruthyCheck(
             prepareLoopStatements
             );
     }
     else if (astNode.Type == EachBlock.LoopType.CompileTime)
     {
         //Check if loop is completed
         var ctLoopContext = state.ContextStack.Peek() as CompileTimeLoopContext;
         if (ctLoopContext.MoveNext())
         {//Next Iteration
             astNode.Accept(this);
         }
         else
         {//Pop ctLoopContext
             state.ContextStack.Pop();
             state.DoTruthyCheck(state.PopBlock());
         }
     }
 }
 public void VisitLeave(EachBlock astNode)
 {
     state.SetCursor(astNode);
       if (astNode.Type==EachBlock.LoopType.RunTime)
       {
     if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Index) || astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Last))
       state.IncrementIndexVariable();
     if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.First))
       state.SetFirstVariable();
     //Leave loop context
     state.ContextStack.Pop();
     state.LoopLevel--;
     var prepareLoopStatements = SyntaxHelper.PrepareForLoop(astNode.Flags, state.LoopLevel + 1);
     Context context;
     if (astNode.Member.TryEvaluate(state, out context))
     {
       prepareLoopStatements.Add(SyntaxHelper.ForLoop(astNode.Member.EvaluateLoop(state).FullPath, context.FullPath, state.PopBlock()));
     }
     state.DoTruthyCheck(
     prepareLoopStatements
     );
       } else if (astNode.Type==EachBlock.LoopType.CompileTime)
       {
     //Check if loop is completed
     var ctLoopContext = state.ContextStack.Peek() as CompileTimeLoopContext;
     if (ctLoopContext.MoveNext())
     {//Next Iteration
       astNode.Accept(this);
     }
     else
     {//Pop ctLoopContext
       state.ContextStack.Pop();
       state.DoTruthyCheck(state.PopBlock());
     }
       }
 }