private static IObject EvalWhileExpression(Ast.WhileExpression we, Environment env)
        {
            var condition = Eval(we.Condition, env);

            if (IsError(condition))
            {
                return(condition);
            }

            IObject result = Null;

            while (IsTruthy(condition))
            {
                result    = Eval(we.Consequence, env);
                condition = Eval(we.Condition, env);
            }

            return(result);
        }
        private Ast.WhileExpression ParseWhileExpression()
        {
            var expression = new Ast.WhileExpression()
            {
                Token = _curToken
            };

            NextToken();

            expression.Condition = ParseExpression(Precedence.Lowest);

            if (!ExpectPeek(TokenType.Lbrace))
            {
                return(null);
            }

            expression.Consequence = ParseBlockStatement();

            return(expression);
        }