@@ -9,32 +9,64 @@ import qualified SourceSyntax.Pattern as Pattern
99import qualified SourceSyntax.Type as Type
1010import qualified SourceSyntax.Literal as Literal
1111
12−type LExpr tipe var = Location.Located (Expr tipe var)
13−data Expr t v
12+{-| This is a located expression. -}
13+type LExpr' def = Location.Located (Expr' def)
14+
15+{-| This is a fully general expression. The compilation process will enrich
16+this data structure with additional information after the initial parse.
17+The type holes let us reflect these structural changes in the types.
18+
19+ def: Parsing allows two kinds of definitions (type annotations or definitions),
20+ but later checks will see that they are well formed and combine them.
21+
22+ t: for adding type information, currently unused
23+
24+ v: for enriching variables with information like provenonce, currently unused
25+
26+Please don't get on my case to take the unused ones out. I have considered it.
27+It's a huge pain to add and remove, it will get used eventually, and it's not
28+hurting anything as it is.
29+-}
30+data Expr' def
1431 = Literal Literal.Literal
1532 | Var String
16− | Range (LExpr t v) (LExpr t v)
17− | ExplicitList [LExpr t v]
18− | Binop String (LExpr t v) (LExpr t v)
19− | Lambda Pattern.Pattern (LExpr t v)
20− | App (LExpr t v) (LExpr t v)
21− | MultiIf [(LExpr t v,LExpr t v)]
22− | Let [Def t v] (LExpr t v)
23− | Case (LExpr t v) [(Pattern.Pattern, LExpr t v)]
24− | Data String [LExpr t v]
25− | Access (LExpr t v) String
26− | Remove (LExpr t v) String
27− | Insert (LExpr t v) String (LExpr t v)
28− | Modify (LExpr t v) [(String, LExpr t v)]
29− | Record [(String, LExpr t v)]
30− | Markdown String String [LExpr t v]
33+ | Range (LExpr' def) (LExpr' def)
34+ | ExplicitList [LExpr' def]
35+ | Binop String (LExpr' def) (LExpr' def)
36+ | Lambda Pattern.Pattern (LExpr' def)
37+ | App (LExpr' def) (LExpr' def)
38+ | MultiIf [(LExpr' def,LExpr' def)]
39+ | Let [def] (LExpr' def)
40+ | Case (LExpr' def) [(Pattern.Pattern, LExpr' def)]
41+ | Data String [LExpr' def]
42+ | Access (LExpr' def) String
43+ | Remove (LExpr' def) String
44+ | Insert (LExpr' def) String (LExpr' def)
45+ | Modify (LExpr' def) [(String, LExpr' def)]
46+ | Record [(String, LExpr' def)]
47+ | Markdown String String [LExpr' def]
3148 deriving (Eq)
3249
33−data Def tipe var
34− = Def Pattern.Pattern (LExpr tipe var)
50+type ParseExpr = Expr' ParseDef
51+type LParseExpr = LExpr' ParseDef
52+type LExpr = LExpr' Def
53+type Expr = Expr' Def
54+
55+{-| Style of definitions as they are parsed. Users specify them
56+separately, and other checks will make sure they can be combined.
57+-}
58+data ParseDef
59+ = Def Pattern.Pattern LParseExpr
3560 | TypeAnnotation String Type.Type
3661 deriving (Eq, Show)
3762
63+{-| After checking that type annotations and definitions are all
64+valid, they can be combined.
65+-}
66+data Def
67+ = Definition Pattern.Pattern (LExpr' Def) (Maybe Type.Type)
68+ deriving (Eq, Show)
69+
3870tuple es = Data ("_Tuple" ++ show (length es)) es
3971
4072delist (Location.L _ (Data "::" [h,t])) = h : delist t
@@ -45,10 +77,10 @@ saveEnvName = "_save_the_environment!!!"
4577dummyLet defs =
4678 Location.none $ Let defs (Location.none $ Var saveEnvName)
4779
48−instance Show (Expr t v) where
80+instance Pretty def => Show (Expr' def) where
4981 show = render . pretty
5082
51−instance Pretty (Expr t v) where
83+instance Pretty def => Pretty (Expr' def) where
5284 pretty expr =
5385 case expr of
5486 Literal lit -> pretty lit
@@ -80,9 +112,9 @@ instance Pretty (Expr t v) where
80112 Access e x -> prettyParens e <> P.text "." <> variable x
81113 Remove e x -> P.braces (pretty e <+> P.text "-" <+> variable x)
82114 Insert (Location.L _ (Remove e y)) x v ->
83− P.braces (pretty e <+> P.text "-" <+> variable y <+> P.text "|" <+> variable x <+> P.text "=" <+> pretty v)
115+ P.braces (pretty e <+> P.text "-" <+> variable y <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)
84116 Insert e x v ->
85− P.braces (pretty e <+> P.text "|" <+> variable x <+> P.text "=" <+> pretty v)
117+ P.braces (pretty e <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)
86118
87119 Modify e fs ->
88120 P.braces $ P.hang (pretty e <+> P.text "|")
@@ -94,17 +126,26 @@ instance Pretty (Expr t v) where
94126 Record fs ->
95127 P.braces $ P.nest 2 (commaSep $ map field fs)
96128 where
97− field (x,e) = variable x <+> P.text "=" <+> pretty e
129+ field (x,e) = variable x <+> P.equals <+> pretty e
98130
99131 Markdown _ _ _ -> P.text "[markdown| ... |]"
100132
101−instance Pretty (Def t v) where
133+instance Pretty ParseDef where
102134 pretty def =
103135 case def of
104136 TypeAnnotation name tipe ->
105− variable name <+> P.text ":" <+> pretty tipe
137+ variable name <+> P.colon <+> pretty tipe
106138 Def pattern expr ->
107− pretty pattern <+> P.text "=" <+> pretty expr
139+ pretty pattern <+> P.equals <+> pretty expr
140+
141+instance Pretty Def where
142+ pretty (Definition pattern expr maybeTipe) =
143+ P.vcat [ annotation, definition ]
144+ where
145+ definition = pretty pattern <+> P.equals <+> pretty expr
146+ annotation = case maybeTipe of
147+ Nothing -> P.empty
148+ Just tipe -> pretty pattern <+> P.colon <+> pretty tipe
108149
109150collectApps lexpr@(Location.L _ expr) =
110151 case expr of