@@ -82,14 +82,7 @@ lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
8282assignExpr = do
8383 patterns <- spaceSep1 (patternTerm <?> "the definition of a variable (x = ...)")
8484 whitespace; string "="; whitespace; exp <- expr
85− case patterns of
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."
85+ flattenPatterns patterns exp
9386
9487letExpr = do
9588 reserved "let"
@@ -97,12 +90,12 @@ letExpr = do
9790 whitespace
9891 char '{' <?> "a set of definitions { x = ... ; y = ... }"
9992 case brace of
100− Nothing -> do whitespace; f <- assignExpr; whitespace; reserved "in"; whitespace
101− Let [f] <$> expr
102− Just '{' -> do whitespace ; fs <- semiSep1 assignExpr ; whitespace
93+ Nothing -> do whitespace; ds <- assignExpr
94+ whitespace; reserved "in"; whitespace; Let ds <$> expr
95+ Just '{' -> do whitespace ; dss <- semiSep1 assignExpr ; whitespace
10396 string "}" <?> "closing bracket '}'"
10497 whitespace; reserved "in"; whitespace; e <- expr
105− return (Let fs e)
98+ return $ Let (concat dss) e
10699
107100caseExpr = do
108101 reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
@@ -113,8 +106,8 @@ caseExpr = do
113106
114107expr = choice [ ifExpr, letExpr, caseExpr, lambdaExpr, binaryExpr ] <?> "expression"
115108
116−def = do (f,e) <- assignExpr
117− return ([f], [e], guid >>= \x -> return [VarT x])
109+def = do (fs,es) <- unzip <$> assignExpr
110+ return (fs, es, mapM (\_ -> liftM VarT guid) fs)
118111
119112defs1 = do optional freshLine
120113 d <- datatype <|> def