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