]> git.rmz.io Git - my-scheme.git/commitdiff
Parse Strings surrounded by `"`
authorSamir Benmendil <me@rmz.io>
Sun, 14 Jan 2018 00:03:01 +0000 (00:03 +0000)
committerSamir Benmendil <me@rmz.io>
Sun, 14 Jan 2018 00:03:01 +0000 (00:03 +0000)
We need to use a `do-block` because we would like to keep the return
value of a parse in the middle. So we parse a single `char '"'`, parse
`many (noneOf "\"")` and assign the return value to `x` and parse
another `"`.

We apply the `String` constructor to the value of `x` to turn it into a
`LispVal` with `String x`.

Finally we inject the `LispVal` into the `Parser` monad. We need to do
this because each line of a `do-block` needs to be of the same type but
the result of `String x` is a `LispVal`, not a `Parser`. `return` wraps
the `LispVal` up in a `Parser` action that consumes no input.

Consider `a $ b c` as syntactic sugar for `a (b c)`.

app/Main.hs

index c64fd18d83b0cdf0575889388df8cfa6344619c8..22de7480421b03aaa552b541b8266a4a9bd41135 100644 (file)
@@ -15,6 +15,13 @@ symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
 spaces :: Parser ()
 spaces = skipMany space
 
+parseString :: Parser LispVal
+parseString = do
+    char '"'
+    x <- many (noneOf "\"")
+    char '"'
+    return $ String x
+
 readExpr :: String -> String
 readExpr input = case parse (spaces >> symbol) "lisp" input of
     Left err -> "No match: " ++ show err