From: Samir Benmendil Date: Sat, 13 Jan 2018 23:24:30 +0000 (+0000) Subject: Ignore spaces X-Git-Url: https://git.rmz.io/my-scheme.git/commitdiff_plain/429ac1845f1b93f54bca8511a4efbf8cbcbb9bf3?ds=sidebyside Ignore spaces We add the spaces `Parser` which returns nothing `()` and skips any spaces. `spaces` is already defined in Parsec, but does not do exactly what we want, we can hide it from the import. `skipMany a` matches 0 or more `a` and skips them. `>>` is the **bind** operator. It may have completely different meanings depending on the monad you use. In the Parser monad in means "try the first parameter, then try the second with anything that is left", i.e. "first skip all the spaces, then match the symbol". --- diff --git a/app/Main.hs b/app/Main.hs index a94dc2c..8520891 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,12 +1,15 @@ module Main where -import Text.ParserCombinators.Parsec +import Text.ParserCombinators.Parsec hiding (spaces) import System.Environment symbol :: Parser Char symbol = oneOf "!#$%&|*+-/:<=>?@^_~" +spaces :: Parser () +spaces = skipMany space + readExpr :: String -> String -readExpr input = case parse symbol "lisp" input of +readExpr input = case parse (spaces >> symbol) "lisp" input of Left err -> "No match: " ++ show err Right val -> "Found value"