public int Foreach(int loopVarIndex, int collectionIndex, params int[] loopContentIndexes)
        {
            var loopVarExpr    = (ParameterExpression)Expressions[loopVarIndex];
            var collectionExpr = Expressions[collectionIndex];
            var expr           = LoopProvider.ForEach(collectionExpr, loopVarExpr,
                                                      Expression.Block(loopContentIndexes.Select(i => Expressions[i])));

            return(RegisterExpression(expr));
        }
        public int For(int loopVarIndex, int maxIterationsIndex, params int[] loopContentIndexes)
        {
            var loopVarExpr      = (ParameterExpression)Expressions[loopVarIndex];
            var maxItExpr        = Expressions[maxIterationsIndex];
            var initValueExpr    = Expression.Constant(0);
            var conditionExpr    = Expression.LessThan(loopVarExpr, maxItExpr);
            var incrementExpr    = Expression.PostIncrementAssign(loopVarExpr);
            var loopContentBlock = Expression.Block(loopContentIndexes.Select(i => Expressions[i]));

            var expr =
                LoopProvider.For(loopVarExpr, initValueExpr, conditionExpr, incrementExpr, loopContentBlock);

            return(RegisterExpression(expr));
        }
        public int For(int loopVarIndex, int initValueIndex, int conditionIndex, int incrementIndex,
                       params int[] loopContentIndexes)
        {
            var loopVarExpr      = (ParameterExpression)Expressions[loopVarIndex];
            var initValueExpr    = Expressions[initValueIndex];
            var conditionExpr    = Expressions[conditionIndex];
            var incrementExpr    = Expressions[incrementIndex];
            var loopContentBlock = Expression.Block(loopContentIndexes.Select(i => Expressions[i]));

            var expr =
                LoopProvider.For(loopVarExpr, initValueExpr, conditionExpr, incrementExpr, loopContentBlock);

            return(RegisterExpression(expr));
        }