@@ -82,14 +82,7 @@ lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
82assignExpr = do
82assignExpr = do
83 patterns <- spaceSep1 (patternTerm <?> "the definition of a variable (x = ...)")
83 patterns <- spaceSep1 (patternTerm <?> "the definition of a variable (x = ...)")
84 whitespace; string "="; whitespace; exp <- expr
84 whitespace; string "="; whitespace; exp <- expr
85− case patterns of
85+ flattenPatterns patterns exp
86− PVar f : args -> return (f, makeFunction args exp)
87− [PData x ps] -> if "Tuple" == take 5 x && all isDigit (drop 5 x) then
88− fail "matching tuples is not yet supported in this context"
89− else fail $ "Only tuples can be matched in this context, " ++
90− "not other abstract data types such as lists."
91− _ -> fail $ "Left-hand side of assign statement is not acceptable: " ++
92− "only named variables, named functions, and tuples are okay."
94letExpr = do
87letExpr = do
95 reserved "let"
88 reserved "let"
@@ -97,12 +90,12 @@ letExpr = do
97 whitespace
90 whitespace
98 char '{' <?> "a set of definitions { x = ... ; y = ... }"
91 char '{' <?> "a set of definitions { x = ... ; y = ... }"
99 case brace of
92 case brace of
100− Nothing -> do whitespace; f <- assignExpr; whitespace; reserved "in"; whitespace
93+ Nothing -> do whitespace; ds <- assignExpr
101− Let [f] <$> expr
94+ whitespace; reserved "in"; whitespace; Let ds <$> expr
102− Just '{' -> do whitespace ; fs <- semiSep1 assignExpr ; whitespace
95+ Just '{' -> do whitespace ; dss <- semiSep1 assignExpr ; whitespace
103 string "}" <?> "closing bracket '}'"
96 string "}" <?> "closing bracket '}'"
104 whitespace; reserved "in"; whitespace; e <- expr
97 whitespace; reserved "in"; whitespace; e <- expr
105− return (Let fs e)
98+ return $ Let (concat dss) e
107caseExpr = do
100caseExpr = do
108 reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
101 reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
@@ -113,8 +106,8 @@ caseExpr = do
114expr = choice [ ifExpr, letExpr, caseExpr, lambdaExpr, binaryExpr ] <?> "expression"
107expr = choice [ ifExpr, letExpr, caseExpr, lambdaExpr, binaryExpr ] <?> "expression"
116−def = do (f,e) <- assignExpr
109+def = do (fs,es) <- unzip <$> assignExpr
117− return ([f], [e], guid >>= \x -> return [VarT x])
110+ return (fs, es, mapM (\_ -> liftM VarT guid) fs)
119defs1 = do optional freshLine
112defs1 = do optional freshLine
120 d <- datatype <|> def
113 d <- datatype <|> def