'o' -> readOct
'b' -> readInt 2 (\x -> elem x "01") (read . (:[]))
+parseList :: Parser LispVal
+parseList = liftM List $ sepBy parseExpr spaces
+
+parseDottedList :: Parser LispVal
+parseDottedList = do
+ head <- endBy parseExpr spaces
+ tail <- char '.' >> spaces >> parseExpr
+ return $ DottedList head tail
+
+parseQuoted :: Parser LispVal
+parseQuoted = do
+ char '\''
+ x <- parseExpr
+ return $ List [Atom "quote", x]
+
parseExpr :: Parser LispVal
parseExpr = parseString
- <|> parseCharacter
<|> parseNumber
<|> parseAtom
+ <|> try parseCharacter
+ <|> parseQuoted
+ <|> do char '('
+ x <- try parseList <|> parseDottedList
+ char ')'
+ return x
readExpr :: String -> String
readExpr input = case parse parseExpr "lisp" input of
Left err -> "No match: " ++ show err
- Right val -> "Found value: " ++ show val
+ Right val -> "Found value: " ++ showVal val
+
+showVal :: LispVal -> String
+showVal (Atom atom) = atom
+showVal (Number n) = show n
+showVal (String str) = "\"" ++ str ++ "\""
+showVal (Character c) = "'" ++ [c] ++ "'"
+showVal (Bool True) = "#t"
+showVal (Bool False) = "#f"
main :: IO ()
main = do