]> git.rmz.io Git - my-scheme.git/blobdiff - app/Main.hs
Using the "bind" operator
[my-scheme.git] / app / Main.hs
index 015db3ad73adae9dec4ac67b281ac3e57c1d5fc0..88ae7f7ff2ff0b439dcb452d24c2be9a66e55e41 100644 (file)
@@ -1,11 +1,54 @@
 module Main where
-import Text.ParserCombinators.Parsec
+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)