Skip to content
Snippets Groups Projects
Commit fd638c3c authored by ik1g19's avatar ik1g19
Browse files

progress on challenge 4

parent 14d63f3c
No related branches found
No related tags found
No related merge requests found
...@@ -278,8 +278,8 @@ prettyPrint (LamDef ms e) = exprBrackets e ...@@ -278,8 +278,8 @@ prettyPrint (LamDef ms e) = exprBrackets e
--applies brackets to expr if needed --applies brackets to expr if needed
exprBrackets :: LamExpr -> String exprBrackets :: LamExpr -> String
exprBrackets e | expr str == e = str --omit brackets exprBrackets e | fst (head (parse expr str)) == e = str --omit brackets
| otherwise = "(" + str ++ ")" --include brackets | otherwise = "(" ++ str ++ ")" --include brackets
where where
str = exprToStr e str = exprToStr e
...@@ -318,36 +318,63 @@ ex3'4 = LamDef [ ("F", LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamAbs 1 (LamV ...@@ -318,36 +318,63 @@ ex3'4 = LamDef [ ("F", LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamAbs 1 (LamV
parseLamMacro :: String -> Maybe LamMacroExpr parseLamMacro :: String -> Maybe LamMacroExpr
parseLamMacro _ = Nothing parseLamMacro str | parsed == [] = Nothing
| otherwise = Just parsed
where
parsed = fst (head (parse (macroExpr []) str)) --HEAD WILL NOT WORK
macroExpr :: Parse LamMacroExpr macroExpr :: [ (String,LamExpr) ] -> Parser LamMacroExpr
macroExpr = do string "def" macroExpr ms = do string "def"
name <- token macroName name <- token macroName
symbol "=" symbol "="
e <- token expr e <- token expr
string "in" token $ string "in"
macro <- many macroExpr macros <- macroExpr $ ms ++ [(name,e)]
return $ LamDef [(name,e)] return $ macros
<|> do e <- token expr
return $ LamDef ms e
-- macroExpr :: Parse LamMacroExpr
-- macroExpr = do string "def"
-- name <- token macroName
-- symbol "="
-- e <- token expr
-- token $ string "in"
-- macros <- macroLoop
-- return $ LamDef macros
-- where
-- macroLoop :: Parse [(String,LamExpr)]
-- macroLoop = do string "def"
-- name <- token macroName
-- symbol "="
-- e <- token expr
-- token $ string "in"
-- ms <- many macroExpr
-- return ((name,e):ms) <|>
-- do {e <- token expr;return []}
expr :: Parser LamExpr expr :: Parser LamExpr
expr = do {x <- var; return $ LamVar x} <|> expr = do {x <- var; return $ LamVar x}
do {name <- macroName;return $ LamMacro name} <|> <|> do {name <- macroName;return $ LamMacro name}
do e1 <- expr <|> do e1 <- expr
space space
e2 <- expr e2 <- expr
return $ LamApp e1 e2 <|> return $ LamApp e1 e2
do char '\' <|> do char '\\'
x <- var x <- var
symbol "->" symbol "->"
e <- expr e <- expr
return $ LamAbs x e <|> return $ LamAbs x e
do char '(' <|> do char '('
e <- token expr e <- token expr
char ')' char ')'
return e return e
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment