Salut à tous,
j'ai commencé ce matin le tuto Write Yourself a Scheme in 48 Hours, j'en suis actuellement au chapitre 2 et je ne comprends pas le fonctionnement des parsers. Avant tout voici le code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | module Main where import Text.ParserCombinators.Parsec hiding (spaces) import System.Environment import Control.Monad data LispVal = Atom String | List [LispVal] | DottedList [LispVal] LispVal | Number Integer | String String | Bool Bool main :: IO () main = do (expr:_) <- getArgs putStrLn (readExpr expr) readExpr :: String -> String readExpr input = case parse parseExpr "lisp" input of Left err -> "No match: " ++ show err Right val -> "Found value" parseExpr :: Parser LispVal parseExpr = parseAtom <|> parseString <|> parseNumber parseString :: Parser LispVal parseString = do char '"' x <- many (noneOf "\"") char '"' return $ String x parseAtom :: Parser LispVal parseAtom = do first <- letter <|> symbol rest <- many (letter <|> digit <|> symbol) let atom = first:rest return $ case atom of "#t" -> Bool True "#f" -> Bool False _ -> Atom atom parseNumber :: Parser LispVal parseNumber = liftM (Number . read) $ many1 digit |
En fait je ne comprends pas comment la fonction parse
fait pour parser avec parseExpr
alors que parseExpr
ne prend pas d'arguments et du coup tout me parait flou et je bloque.
Merci d'avance de votre aide.
+1
-0