eval (WhileStat c b) = do
  pushState >> doWhile c b >>= \v -> popState >> return v
  where
    doWhile c b = do
      c' <- eval c
      case toBool c' of
        True -> do
          eval b
          doWhile c b
        False -> do
          return Nil
eval (WhileStat c b) = do
  pushState >> doWhile c b >>= \v -> popState >> return v
  where
    doWhile c b = do
      c' <- eval c
      case toBool c' of
        True -> do
          eval b
          doWhile c b
        False -> do
          return Nil
eval (WhileStat c b) = do
  pushState >> doWhile c b >>= \v -> popState >> return v
  where
    doWhile c b = do
      c' <- eval c
      case toBool c' of
        True -> do
          eval b
          doWhile c b
        False -> do
          return Nil