@@ -215,50 +215,51 @@ expression (A region expr) =
217definition :: Canonical.Def -> State Int [Statement ()]
217definition :: Canonical.Def -> State Int [Statement ()]
218−definition (Canonical.Definition pattern expr@(A region _) _) = do
218+definition (Canonical.Definition pattern expr@(A region _) _) =
219− expr' <- expression expr
219+ do expr' <- expression expr
220− let assign x = varDecl x expr'
220+ let assign x = varDecl x expr'
221− case pattern of
221+ case pattern of
223− | Help.isOp x ->
223+ | Help.isOp x ->
224− let op = LBracket () (ref "_op") (string x) in
224+ let op = LBracket () (ref "_op") (string x) in
225− return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
225+ return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
226− | otherwise ->
227+ | otherwise ->
227− return [ VarDeclStmt () [ assign (Var.varName x) ] ]
228+ return [ VarDeclStmt () [ assign (Var.varName x) ] ]
229− P.Record fields ->
230+ P.Record fields ->
230− let setField f = varDecl f (obj ["$",f]) in
231+ let setField f = varDecl f (obj ["$",f]) in
231− return [ VarDeclStmt () (assign "$" : map setField fields) ]
232+ return [ VarDeclStmt () (assign "$" : map setField fields) ]
233− P.Data (Var.Canonical _ name) patterns | vars /= Nothing ->
234+ P.Data (Var.Canonical _ name) patterns | vars /= Nothing ->
234− return [ VarDeclStmt () (setup (zipWith decl (maybe [] id vars) [0..])) ]
235+ return [ VarDeclStmt () (setup (zipWith decl (maybe [] id vars) [0..])) ]
236− vars = getVars patterns
237+ vars = getVars patterns
237− getVars patterns =
238+ getVars patterns =
238− case patterns of
239+ case patterns of
239− P.Var x : rest -> (Var.varName x :) `fmap` getVars rest
240+ P.Var x : rest -> (Var.varName x :) `fmap` getVars rest
240− [] -> Just []
241+ [] -> Just []
241− _ -> Nothing
242+ _ -> Nothing
243− decl x n = varDecl x (obj ["$","_" ++ show n])
244+ decl x n = varDecl x (obj ["$","_" ++ show n])
244− setup vars
245+ setup vars
245− | Help.isTuple name = assign "$" : vars
246+ | Help.isTuple name = assign "$" : vars
246− | otherwise = assign "_raw" : safeAssign : vars
247+ | otherwise = assign "_raw" : safeAssign : vars
248− safeAssign = varDecl "$" (CondExpr () if' (ref "_raw") exception)
249+ safeAssign = varDecl "$" (CondExpr () if' (ref "_raw") exception)
249− if' = InfixExpr () OpStrictEq (obj ["_raw","ctor"]) (string name)
250+ if' = InfixExpr () OpStrictEq (obj ["_raw","ctor"]) (string name)
250− exception = Help.throw "badCase" region
251+ exception = Help.throw "badCase" region
253− do defs' <- concat <$> mapM toDef vars
254+ do defs' <- concat <$> mapM toDef vars
254− return (VarDeclStmt () [assign "_"] : defs')
255+ return (VarDeclStmt () [assign "_"] : defs')
256− vars = P.boundVarList pattern
257+ vars = P.boundVarList pattern
257− mkVar = A region . localVar
258+ mkVar = A region . localVar
258− toDef y =
259+ toDef y =
259− let expr = A region $ Case (mkVar "_") [(pattern, mkVar y)]
260+ let expr = A region $ Case (mkVar "_") [(pattern, mkVar y)]
261− definition $ Canonical.Definition (P.Var y) expr Nothing
262+ definition $ Canonical.Definition (P.Var y) expr Nothing
264match :: Region -> Case.Match -> State Int [Statement ()]
265match :: Region -> Case.Match -> State Int [Statement ()]