]> git.rmz.io Git - my-scheme.git/blob - app/Main.hs
cea4c9b2f5e9f08230d49f837338d1e9cce484a7
[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 deriving Show
13
14 symbol :: Parser Char
15 symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
16
17 spaces :: Parser ()
18 spaces = skipMany space
19
20 parseString :: Parser LispVal
21 parseString = do char '"'
22 x <- many innerChar
23 char '"'
24 return $ String x
25 where innerChar = noneOf "\""
26
27 parseAtom :: Parser LispVal
28 parseAtom = do
29 a <- letter <|> symbol
30 b <- many (letter <|> digit <|> symbol)
31 let atom = a:b
32 return $ case atom of
33 "#t" -> Bool True
34 "#f" -> Bool False
35 _ -> Atom atom
36
37 parseNumber :: Parser LispVal
38 parseNumber = do ds <- many1 digit
39 let a = read ds
40 return $ Number a
41
42 parseExpr :: Parser LispVal
43 parseExpr = parseString
44 <|> parseAtom
45 <|> parseNumber
46
47 readExpr :: String -> String
48 readExpr input = case parse parseExpr "lisp" input of
49 Left err -> "No match: " ++ show err
50 Right val -> "Found value: " ++ show val
51
52 main :: IO ()
53 main = do
54 args <- getLine
55 putStrLn (readExpr args)
56 main