@@ -18,6 +18,7 @@ import qualified AST.Literal as Literal
18import qualified AST.Pattern as Pattern
18import qualified AST.Pattern as Pattern
19import qualified AST.Variable as Var
19import qualified AST.Variable as Var
21---- GENERAL AST ----
22---- GENERAL AST ----
23{-| This is a fully general Abstract Syntax Tree (AST) for expressions. It has
24{-| This is a fully general Abstract Syntax Tree (AST) for expressions. It has
@@ -38,6 +39,7 @@ move through the compilation process. The type holes are used to represent:
38type Expr annotation definition variable =
39type Expr annotation definition variable =
39 Annotation.Annotated annotation (Expr' annotation definition variable)
40 Annotation.Annotated annotation (Expr' annotation definition variable)
41data Expr' ann def var
43data Expr' ann def var
42 = Literal Literal.Literal
44 = Literal Literal.Literal
@@ -65,24 +67,29 @@ data Expr' ann def var
65---- UTILITIES ----
67---- UTILITIES ----
67rawVar :: String -> Expr' ann def Var.Raw
69rawVar :: String -> Expr' ann def Var.Raw
68−rawVar x = Var (Var.Raw x)
71+ Var (Var.Raw x)
70localVar :: String -> Expr' ann def Var.Canonical
74localVar :: String -> Expr' ann def Var.Canonical
71−localVar x = Var (Var.Canonical Var.Local x)
76+ Var (Var.Canonical Var.Local x)
73tuple :: [Expr ann def var] -> Expr' ann def var
79tuple :: [Expr ann def var] -> Expr' ann def var
74−tuple es = Data ("_Tuple" ++ show (length es)) es
81+ Data ("_Tuple" ++ show (length expressions)) expressions
76−delist :: Expr ann def var -> [Expr ann def var]
77−delist (Annotation.A _ (Data "::" [h,t])) = h : delist t
80saveEnvName :: String
84saveEnvName :: String
81−saveEnvName = "_save_the_environment!!!"
86+ "_save_the_environment!!!"
83dummyLet :: (Pretty def) => [def] -> Expr Annotation.Region def Var.Canonical
89dummyLet :: (Pretty def) => [def] -> Expr Annotation.Region def Var.Canonical
84dummyLet defs =
90dummyLet defs =
85− Annotation.none $ Let defs (Annotation.none $ Var (Var.builtin saveEnvName))
91+ Annotation.none $ Let defs (Annotation.none $ Var (Var.builtin saveEnvName))
87instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var) where
94instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var) where
88 pretty expr =
95 pretty expr =
@@ -138,11 +145,17 @@ instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var
138 pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]
145 pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]
139 pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b
146 pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b
148+ Data "::" [hd,tl] ->
141− Data "::" [hd,tl] -> pretty hd <+> P.text "::" <+> pretty tl
149+ pretty hd <+> P.text "::" <+> pretty tl
142− Data "[]" [] -> P.text "[]"
152+ P.text "[]"
143 Data name es
154 Data name es
155+ | Help.isTuple name ->
144− | Help.isTuple name -> P.parens (commaCat (map pretty es))
156+ P.parens (commaCat (map pretty es))
145− | otherwise -> P.hang (P.text name) 2 (P.sep (map prettyParens es))
158+ P.hang (P.text name) 2 (P.sep (map prettyParens es))
147 Access e x ->
160 Access e x ->
148 prettyParens e <> P.text "." <> variable x
161 prettyParens e <> P.text "." <> variable x
@@ -178,11 +191,14 @@ instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var
178 field (field, value) =
191 field (field, value) =
179 variable field <+> P.equals <+> pretty value
192 variable field <+> P.equals <+> pretty value
181− GLShader _ _ _ -> P.text "[glsl| ... |]"
194+ GLShader _ _ _ ->
195+ P.text "[glsl| ... |]"
183− PortIn name _ -> P.text $ "<port:" ++ name ++ ">"
198+ P.text $ "<port:" ++ name ++ ">"
185− PortOut _ _ signal -> pretty signal
200+ PortOut _ _ signal ->
188collectApps :: Expr ann def var -> [Expr ann def var]
204collectApps :: Expr ann def var -> [Expr ann def var]