]> git.rmz.io Git - my-scheme.git/commitdiff
Add parsers for List, DottedList and Quoted
authorSamir Benmendil <me@rmz.io>
Tue, 23 Jan 2018 20:39:54 +0000 (20:39 +0000)
committerSamir Benmendil <me@rmz.io>
Tue, 23 Jan 2018 20:39:54 +0000 (20:39 +0000)
Nothing really new here.

app/Main.hs

index 03dbb41ad56467919b06e5c72b886c640e697253..fb8294a4df5b4a0e2ef6c6f28f3574b1a2bb61e8 100644 (file)
@@ -65,11 +65,31 @@ parseNumber = do toNum <- radix
                                            'o' -> readOct
                                            'b' -> readInt 2 (\x -> elem x "01") (read . (:[]))
 
+parseList :: Parser LispVal
+parseList = liftM List $ sepBy parseExpr spaces
+
+parseDottedList :: Parser LispVal
+parseDottedList = do
+    head <- endBy parseExpr spaces
+    tail <- char '.' >> spaces >> parseExpr
+    return $ DottedList head tail
+
+parseQuoted :: Parser LispVal
+parseQuoted = do
+    char '\''
+    x <- parseExpr
+    return $ List [Atom "quote", x]
+
 parseExpr :: Parser LispVal
 parseExpr = parseString
-        <|> parseCharacter
         <|> parseNumber
         <|> parseAtom
+        <|> try parseCharacter
+        <|> parseQuoted
+        <|> do char '('
+               x <- try parseList <|> parseDottedList
+               char ')'
+               return x
 
 readExpr :: String -> String
 readExpr input = case parse parseExpr "lisp" input of