module Main where
+import Control.Monad
import Text.ParserCombinators.Parsec hiding (spaces)
import System.Environment
| Number Integer
| String String
| Bool Bool
+ deriving Show
symbol :: Parser Char
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
parseAtom = do
a <- letter <|> symbol
b <- many (letter <|> digit <|> symbol)
- return $ Atom (a:b)
+ let atom = a:b
+ return $ case atom of
+ "#t" -> Bool True
+ "#f" -> Bool False
+ _ -> Atom atom
+
+parseNumber :: Parser LispVal
+parseNumber = do ds <- many1 digit
+ let a = read ds
+ return $ Number a
+
+parseExpr :: Parser LispVal
+parseExpr = parseString
+ <|> parseAtom
+ <|> parseNumber
readExpr :: String -> String
-readExpr input = case parse (spaces >> symbol) "lisp" input of
+readExpr input = case parse parseExpr "lisp" input of
Left err -> "No match: " ++ show err
- Right val -> "Found value"
+ Right val -> "Found value: " ++ show val
main :: IO ()
main = do
args <- getLine
putStrLn (readExpr args)
+ main