3 import Text.ParserCombinators.Parsec hiding (spaces)
4 import System.Environment
7 data LispVal = Atom String
9 | DottedList [LispVal] LispVal
16 symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
19 spaces = skipMany space
21 parseString :: Parser LispVal
22 parseString = do char '"'
26 where innerChar = noneOf ['\\', '\"'] <|> escapeChar
27 escapeChar = do char '\\'
28 c <- oneOf ['\"', '\\', 'n', 'r', 't', 'f']
37 parseAtom :: Parser LispVal
39 a <- letter <|> symbol
40 b <- many (letter <|> digit <|> symbol)
47 parseNumber :: Parser LispVal
48 parseNumber = do toNum <- radix
50 let ((a,_):_) = toNum ds
52 where radix = do r <- try (char '#' >> oneOf "bodx") <|> return 'd'
57 'b' -> readInt 2 (\x -> elem x "01") (read . (:[]))
59 parseExpr :: Parser LispVal
60 parseExpr = parseString
64 readExpr :: String -> String
65 readExpr input = case parse parseExpr "lisp" input of
66 Left err -> "No match: " ++ show err
67 Right val -> "Found value: " ++ show val
72 putStrLn (readExpr args)