]> git.rmz.io Git - my-scheme.git/blob - app/Main.hs
Using the "bind" operator
[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 = many1 digit >>= \ ds ->
38 let a = read ds
39 in return $ Number a
40
41 parseExpr :: Parser LispVal
42 parseExpr = parseString
43 <|> parseAtom
44 <|> parseNumber
45
46 readExpr :: String -> String
47 readExpr input = case parse parseExpr "lisp" input of
48 Left err -> "No match: " ++ show err
49 Right val -> "Found value"
50
51 main :: IO ()
52 main = do
53 args <- getLine
54 putStrLn (readExpr args)