2 Copyright(C) 1999 Erik Meijer and Arjan van Yzendoorn
4 Determines wether an express/declaration is "simple".
5 The pretty-printing strategy is to print a "complex" expression
13 isSimpleExpr :: Expr -> Bool
18 ; Case e as -> and [ isSimpleArms as, isSimpleExpr e ]
19 ; Let ds e -> and [ isSimpleDecls ds, isSimpleExpr e ]
20 ; Lambda n e -> isSimpleExpr e
21 ; New n ds -> all isSimpleDecl ds
22 ; App f a -> and [ isSimpleExpr f, isSimpleExpr a]
23 ; Chain e oes -> and [ isSimpleExpr e, all isSimpleExpr [ e | (o,e) <- oes ] ]
27 and [ length as == 1, all isSimpleExpr [ e | (p,e) <- as ], all isSimplePattern [ p | (p,e) <- as ] ]
29 isSimplePattern = \ p->
31 { Pattern n ds -> isSimpleDecls ds
35 isSimpleDecls = \ds ->
36 and [ all isSimpleDecl ds ]
40 { ClassDecl n ns ds -> False
41 ; ImportDecl n -> True
42 ; VarDecl n e -> isSimpleExpr e
46 groupLambdas :: Expr -> Expr
49 { Lambda ns (Lambda ms e) -> groupLambdas (Lambda (ns++ms) e)
53 isTopLevel :: [Name] -> Name -> Bool
54 isTopLevel = \topLevel -> \n ->
57 topLevel :: CompilationUnit -> [Name]
60 { Package n ds -> [ n | VarDecl n e <- ds ]