diff --git a/cw/src/Challenges.hs b/cw/src/Challenges.hs index 1264c1923f1c6631ed30c697c87c745b258ca2ea..cca5fb07e9b8b39e36f77af764d37932e71cd0c9 100644 --- a/cw/src/Challenges.hs +++ b/cw/src/Challenges.hs @@ -323,39 +323,45 @@ parseLamMacro _ = Nothing macroExpr :: Parse LamMacroExpr macroExpr = do string "def" - space - name <- macroName - space - + name <- token macroName + symbol "=" + e <- token expr + string "in" + macro <- many macroExpr + return $ LamDef [(name,e)] expr :: Parser LamExpr expr = do {x <- var; return $ LamVar x} <|> + do {name <- macroName;return $ LamMacro name} <|> + do e1 <- expr space e2 <- expr return $ LamApp e1 e2 <|> + do char '\' x <- var symbol "->" e <- expr return $ LamAbs x e <|> + do char '(' - e <- identifier + e <- token expr char ')' return e macroName :: Parser String macroName = do name <- some upper - return $ name + return name var :: Parser Int var = do char 'x' - x <- some digit - return $ read x + x <- nat + return x