module Main where
+import Control.Monad
+import Text.ParserCombinators.Parsec hiding (spaces)
import System.Environment
+data LispVal = Atom String
+ | List [LispVal]
+ | DottedList [LispVal] LispVal
+ | Number Integer
+ | String String
+ | Bool Bool
+
+symbol :: Parser Char
+symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
+
+spaces :: Parser ()
+spaces = skipMany space
+
+parseString :: Parser LispVal
+parseString = do
+ char '"'
+ x <- many (noneOf "\"")
+ char '"'
+ return $ String x
+
+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
+
+readExpr :: String -> String
+readExpr input = case parse parseExpr "lisp" input of
+ Left err -> "No match: " ++ show err
+ Right val -> "Found value"
+
main :: IO ()
main = do
args <- getLine
- putStrLn (args)
+ putStrLn (readExpr args)