]> git.rmz.io Git - my-scheme.git/blob - app/Main.hs
58017c55305aa90095ba786e78ed009df4209040
[my-scheme.git] / app / Main.hs
1 module Main where
2 import Control.Monad
3 import Text.ParserCombinators.Parsec hiding (spaces)
4 import System.Environment
5
6 data LispVal = Atom String
7 | List [LispVal]
8 | DottedList [LispVal] LispVal
9 | Number Integer
10 | String String
11 | Bool Bool
12
13 symbol :: Parser Char
14 symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
15
16 spaces :: Parser ()
17 spaces = skipMany space
18
19 parseString :: Parser LispVal
20 parseString = do
21 char '"'
22 x <- many (noneOf "\"")
23 char '"'
24 return $ String x
25
26 parseAtom :: Parser LispVal
27 parseAtom = do
28 a <- letter <|> symbol
29 b <- many (letter <|> digit <|> symbol)
30 let atom = a:b
31 return $ case atom of
32 "#t" -> Bool True
33 "#f" -> Bool False
34 _ -> Atom atom
35
36 parseNumber :: Parser LispVal
37 parseNumber = liftM (Number . read) $ many1 digit
38
39 parseExpr :: Parser LispVal
40 parseExpr = parseString
41 <|> parseAtom
42 <|> parseNumber
43
44 readExpr :: String -> String
45 readExpr input = case parse parseExpr "lisp" input of
46 Left err -> "No match: " ++ show err
47 Right val -> "Found value"
48
49 main :: IO ()
50 main = do
51 args <- getLine
52 putStrLn (readExpr args)