From fd638c3c6fe7db6098db382ee4d7daefbb7ab07b Mon Sep 17 00:00:00 2001
From: ik1g19 <ik1g19@soton.ac.uk>
Date: Sun, 3 Jan 2021 22:38:24 +0000
Subject: [PATCH] progress on challenge 4

---
 cw/src/Challenges.hs | 63 +++++++++++++++++++++++++++++++-------------
 1 file changed, 45 insertions(+), 18 deletions(-)

diff --git a/cw/src/Challenges.hs b/cw/src/Challenges.hs
index cca5fb0..b53ad3a 100644
--- a/cw/src/Challenges.hs
+++ b/cw/src/Challenges.hs
@@ -278,8 +278,8 @@ prettyPrint (LamDef ms e) = exprBrackets e
 
 --applies brackets to expr if needed
 exprBrackets :: LamExpr -> String
-exprBrackets e | expr str == e = str                                                                 --omit brackets
-               | otherwise     = "(" + str ++ ")"                                                    --include brackets
+exprBrackets e | fst (head (parse expr str)) == e = str                                                                 --omit brackets
+               | otherwise                        = "(" ++ str ++ ")"                                                    --include brackets
     where
       str = exprToStr e
 
@@ -318,36 +318,63 @@ ex3'4 = LamDef [ ("F", LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamAbs 1 (LamV
 
 
 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 :: [ (String,LamExpr) ] -> Parser LamMacroExpr
+macroExpr ms = do string "def"
+                  name  <- token macroName
+                  symbol "="
+                  e     <- token expr
+                  token $ string "in"
+                  macros <- macroExpr $ ms ++ [(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
-               string "in"
-               macro <- many macroExpr
-               return $ LamDef [(name,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 = 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
           e2    <- expr
-          return $ LamApp e1 e2                      <|>
+          return $ LamApp e1 e2
 
-       do char '\'
+   <|> do char '\\'
           x     <- var
           symbol "->"
           e     <- expr
-          return $ LamAbs x e                        <|>
+          return $ LamAbs x e
 
-       do char '('
+   <|> do char '('
           e     <- token expr
           char ')'
           return e
-- 
GitLab