3 import Text.ParserCombinators.Parsec hiding (spaces)
4 import System.Environment
6 data LispVal = Atom String
8 | DottedList [LispVal] LispVal
15 symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
18 spaces = skipMany space
20 parseString :: Parser LispVal
21 parseString = do char '"'
25 where innerChar = noneOf ['\\', '\"'] <|> escapeChar
26 escapeChar = do char '\\'
27 c <- oneOf ['\"', '\\', 'n', 'r', 't', 'f']
36 parseAtom :: Parser LispVal
38 a <- letter <|> symbol
39 b <- many (letter <|> digit <|> symbol)
46 parseNumber :: Parser LispVal
47 parseNumber = do ds <- many1 digit
51 parseExpr :: Parser LispVal
52 parseExpr = parseString
56 readExpr :: String -> String
57 readExpr input = case parse parseExpr "lisp" input of
58 Left err -> "No match: " ++ show err
59 Right val -> "Found value: " ++ show val
64 putStrLn (readExpr args)