@@ -10,7 +10,7 @@ module AST.Expression.General where
1010
1111import AST.PrettyPrint
1212import Text.PrettyPrint as P
13−import AST.Type (Type, PortType)
13+import AST.Type (PortType)
1414
1515import qualified AST.Annotation as Annotation
1616import qualified AST.Helpers as Help
@@ -59,6 +59,7 @@ data Expr' ann def var
5959 | Record [(String, Expr ann def var)]
6060 -- for type checking and code gen only
6161 | Port String (PortType var)
62+ | Perform (Expr ann def var)
6263 | GLShader String String Literal.GLShaderTipe
6364 deriving (Show)
6465
@@ -91,58 +92,59 @@ dummyLet defs =
9192
9293
9394instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var) where
94− pretty expr =
95− case expr of
96− Literal lit ->
97− pretty lit
95+ pretty expression =
96+ case expression of
97+ Literal literal ->
98+ pretty literal
9899
99100 Var x ->
100101 pretty x
101102
102− Range e1 e2 ->
103− P.brackets (pretty e1 <> P.text ".." <> pretty e2)
103+ Range lowExpr highExpr ->
104+ P.brackets (pretty lowExpr <> P.text ".." <> pretty highExpr)
104105
105− ExplicitList es ->
106− P.brackets (commaCat (map pretty es))
106+ ExplicitList elements ->
107+ P.brackets (commaCat (map pretty elements))
107108
108− Binop op (Annotation.A _ (Literal (Literal.IntNum 0))) e
109+ Binop op (Annotation.A _ (Literal (Literal.IntNum 0))) expr
109110 | Var.toString op == "-" ->
110− P.text "-" <> prettyParens e
111+ P.text "-" <> prettyParens expr
111112
112− Binop op e1 e2 ->
113− P.hang (prettyParens e1) 2 (P.text op'' <+> prettyParens e2)
113+ Binop op leftExpr rightExpr ->
114+ P.hang (prettyParens leftExpr) 2 (P.text op'' <+> prettyParens rightExpr)
114115 where
115116 op' = Var.toString op
116117 op'' = if Help.isOp op' then op' else "`" ++ op' ++ "`"
117118
118− Lambda p e ->
119+ Lambda pattern expr ->
119120 P.text "\\" <> args <+> P.text "->" <+> pretty body
120121 where
121− (ps,body) = collectLambdas (Annotation.A undefined $ Lambda p e)
122− args = P.sep (map Pattern.prettyParens ps)
122+ (patterns, body) = collectLambdas expr
123+ args = P.sep (map Pattern.prettyParens (pattern : patterns))
123124
124− App _ _ ->
125+ App expr arg ->
125126 P.hang func 2 (P.sep args)
126127 where
127128 func:args =
128− map prettyParens (collectApps (Annotation.A undefined expr))
129+ map prettyParens (collectApps expr ++ [arg])
129130
130131 MultiIf branches ->
131132 P.text "if" $$ nest 3 (vcat $ map iff branches)
132133 where
133134 iff (b,e) = P.text "|" <+> P.hang (pretty b <+> P.text "->") 2 (pretty e)
134135
135− Let defs e ->
136+ Let defs body ->
136137 P.sep
137138 [ P.hang (P.text "let") 4 (P.vcat (map pretty defs))
138− , P.text "in" <+> pretty e
139+ , P.text "in" <+> pretty body
139140 ]
140141
141− Case e pats ->
142− P.hang pexpr 2 (P.vcat (map pretty' pats))
142+ Case expr branches ->
143+ P.hang pexpr 2 (P.vcat (map pretty' branches))
143144 where
144− pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]
145− pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b
145+ pexpr = P.sep [ P.text "case" <+> pretty expr, P.text "of" ]
146+ pretty' (pattern, branch) =
147+ pretty pattern <+> P.text "->" <+> pretty branch
146148
147149 Data "::" [hd,tl] ->
148150 pretty hd <+> P.text "::" <+> pretty tl
@@ -150,45 +152,45 @@ instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var
150152 Data "[]" [] ->
151153 P.text "[]"
152154
153− Data name es
155+ Data name exprs
154156 | Help.isTuple name ->
155− P.parens (commaCat (map pretty es))
157+ P.parens (commaCat (map pretty exprs))
156158 | otherwise ->
157− P.hang (P.text name) 2 (P.sep (map prettyParens es))
159+ P.hang (P.text name) 2 (P.sep (map prettyParens exprs))
158160
159− Access e x ->
160− prettyParens e <> P.text "." <> variable x
161+ Access record field ->
162+ prettyParens record <> P.text "." <> variable field
161163
162− Remove e x ->
163− P.braces (pretty e <+> P.text "-" <+> variable x)
164+ Remove record field ->
165+ P.braces (pretty record <+> P.text "-" <+> variable field)
164166
165− Insert (Annotation.A _ (Remove e y)) x v ->
167+ Insert (Annotation.A _ (Remove record y)) x v ->
166168 P.braces $
167169 P.hsep
168− [ pretty e, P.text "-", variable y, P.text "|"
170+ [ pretty record, P.text "-", variable y, P.text "|"
169171 , variable x, P.equals, pretty v
170172 ]
171173
172− Insert e x v ->
173− P.braces (pretty e <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)
174+ Insert record field expr ->
175+ P.braces (pretty record <+> P.text "|" <+> variable field <+> P.equals <+> pretty expr)
174176
175− Modify e fs ->
177+ Modify record fields ->
176178 P.braces $
177179 P.hang
178− (pretty e <+> P.text "|")
180+ (pretty record <+> P.text "|")
179181 4
180− (commaSep $ map field fs)
182+ (commaSep $ map field fields)
181183 where
182184 field (k,v) = variable k <+> P.text "<-" <+> pretty v
183185
184− Record fs ->
186+ Record fields ->
185187 P.sep
186− [ P.cat (zipWith (<+>) (P.lbrace : repeat P.comma) (map field fs))
188+ [ P.cat (zipWith (<+>) (P.lbrace : repeat P.comma) (map field fields))
187189 , P.rbrace
188190 ]
189191 where
190− field (name, value) =
191− variable name <+> P.equals <+> pretty value
192+ field (name, expr) =
193+ variable name <+> P.equals <+> pretty expr
192194
193195 GLShader _ _ _ ->
194196 P.text "[glsl| ... |]"
@@ -196,6 +198,9 @@ instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var
196198 Port name _ ->
197199 P.text ("<port:" ++ name ++ ">")
198200
201+ Perform expr ->
202+ P.text "perform" <+> pretty expr
203+
199204
200205collectApps :: Expr ann def var -> [Expr ann def var]
201206collectApps annExpr@(Annotation.A _ expr) =