+parseAtom :: Parser LispVal
+parseAtom = do
+ a <- letter <|> symbol
+ b <- many (letter <|> digit <|> symbol)
+ let atom = a:b
+ return $ case atom of
+ "#t" -> Bool True
+ "#f" -> Bool False
+ _ -> Atom atom
+
+parseNumber :: Parser LispVal
+parseNumber = many1 digit >>= \ ds ->
+ let a = read ds
+ in return $ Number a
+
+parseExpr :: Parser LispVal
+parseExpr = parseString
+ <|> parseAtom
+ <|> parseNumber
+