@@ -10,7 +10,7 @@ module AST.Expression.General where
11import AST.PrettyPrint
11import AST.PrettyPrint
12import Text.PrettyPrint as P
12import Text.PrettyPrint as P
13−import AST.Type (Type, PortType)
13+import AST.Type (PortType)
15import qualified AST.Annotation as Annotation
15import qualified AST.Annotation as Annotation
16import qualified AST.Helpers as Help
16import qualified AST.Helpers as Help
@@ -59,6 +59,7 @@ data Expr' ann def var
59 | Record [(String, Expr ann def var)]
59 | Record [(String, Expr ann def var)]
60 -- for type checking and code gen only
60 -- for type checking and code gen only
61 | Port String (PortType var)
61 | Port String (PortType var)
62+ | Perform (Expr ann def var)
62 | GLShader String String Literal.GLShaderTipe
63 | GLShader String String Literal.GLShaderTipe
63 deriving (Show)
64 deriving (Show)
@@ -91,58 +92,59 @@ dummyLet defs =
93instance (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
94− pretty expr =
95+ pretty expression =
95− case expr of
96+ case expression of
96− Literal lit ->
97+ Literal literal ->
97− pretty lit
98+ pretty literal
102− Range e1 e2 ->
103+ Range lowExpr highExpr ->
103− P.brackets (pretty e1 <> P.text ".." <> pretty e2)
104+ P.brackets (pretty lowExpr <> P.text ".." <> pretty highExpr)
105− ExplicitList es ->
106+ ExplicitList elements ->
106− P.brackets (commaCat (map pretty es))
107+ P.brackets (commaCat (map pretty elements))
108− Binop op (Annotation.A _ (Literal (Literal.IntNum 0))) e
109+ Binop op (Annotation.A _ (Literal (Literal.IntNum 0))) expr
109 | Var.toString op == "-" ->
110 | Var.toString op == "-" ->
110− P.text "-" <> prettyParens e
111+ P.text "-" <> prettyParens expr
112− Binop op e1 e2 ->
113+ Binop op leftExpr rightExpr ->
113− P.hang (prettyParens e1) 2 (P.text op'' <+> prettyParens e2)
114+ P.hang (prettyParens leftExpr) 2 (P.text op'' <+> prettyParens rightExpr)
115 op' = Var.toString op
116 op' = Var.toString op
116 op'' = if Help.isOp op' then op' else "`" ++ op' ++ "`"
117 op'' = if Help.isOp op' then op' else "`" ++ op' ++ "`"
118− Lambda p e ->
119+ Lambda pattern expr ->
119 P.text "\\" <> args <+> P.text "->" <+> pretty body
120 P.text "\\" <> args <+> P.text "->" <+> pretty body
121− (ps,body) = collectLambdas (Annotation.A undefined $ Lambda p e)
122+ (patterns, body) = collectLambdas expr
122− args = P.sep (map Pattern.prettyParens ps)
123+ args = P.sep (map Pattern.prettyParens (pattern : patterns))
124− App _ _ ->
125+ App expr arg ->
125 P.hang func 2 (P.sep args)
126 P.hang func 2 (P.sep args)
127 func:args =
128 func:args =
128− map prettyParens (collectApps (Annotation.A undefined expr))
129+ map prettyParens (collectApps expr ++ [arg])
130 MultiIf branches ->
131 MultiIf branches ->
131 P.text "if" $$ nest 3 (vcat $ map iff branches)
132 P.text "if" $$ nest 3 (vcat $ map iff branches)
133 iff (b,e) = P.text "|" <+> P.hang (pretty b <+> P.text "->") 2 (pretty e)
134 iff (b,e) = P.text "|" <+> P.hang (pretty b <+> P.text "->") 2 (pretty e)
135− Let defs e ->
136+ Let defs body ->
137 [ P.hang (P.text "let") 4 (P.vcat (map pretty defs))
138 [ P.hang (P.text "let") 4 (P.vcat (map pretty defs))
138− , P.text "in" <+> pretty e
139+ , P.text "in" <+> pretty body
141− Case e pats ->
142+ Case expr branches ->
142− P.hang pexpr 2 (P.vcat (map pretty' pats))
143+ P.hang pexpr 2 (P.vcat (map pretty' branches))
144− pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]
145+ pexpr = P.sep [ P.text "case" <+> pretty expr, P.text "of" ]
146+ pretty' (pattern, branch) =
145− pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b
147+ pretty pattern <+> P.text "->" <+> pretty branch
147 Data "::" [hd,tl] ->
149 Data "::" [hd,tl] ->
148 pretty hd <+> P.text "::" <+> pretty tl
150 pretty hd <+> P.text "::" <+> pretty tl
@@ -150,45 +152,45 @@ instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var
150 Data "[]" [] ->
152 Data "[]" [] ->
151 P.text "[]"
153 P.text "[]"
153− Data name es
155+ Data name exprs
154 | Help.isTuple name ->
156 | Help.isTuple name ->
155− P.parens (commaCat (map pretty es))
157+ P.parens (commaCat (map pretty exprs))
156 | otherwise ->
158 | 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))
159− Access e x ->
161+ Access record field ->
160− prettyParens e <> P.text "." <> variable x
162+ prettyParens record <> P.text "." <> variable field
162− Remove e x ->
164+ Remove record field ->
163− P.braces (pretty e <+> P.text "-" <+> variable x)
165+ P.braces (pretty record <+> P.text "-" <+> variable field)
165− Insert (Annotation.A _ (Remove e y)) x v ->
167+ Insert (Annotation.A _ (Remove record y)) x v ->
166 P.braces $
168 P.braces $
168− [ pretty e, P.text "-", variable y, P.text "|"
170+ [ pretty record, P.text "-", variable y, P.text "|"
169 , variable x, P.equals, pretty v
171 , variable x, P.equals, pretty v
172− Insert e x v ->
174+ Insert record field expr ->
173− P.braces (pretty e <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)
175+ P.braces (pretty record <+> P.text "|" <+> variable field <+> P.equals <+> pretty expr)
175− Modify e fs ->
177+ Modify record fields ->
176 P.braces $
178 P.braces $
178− (pretty e <+> P.text "|")
180+ (pretty record <+> P.text "|")
180− (commaSep $ map field fs)
182+ (commaSep $ map field fields)
182 field (k,v) = variable k <+> P.text "<-" <+> pretty v
184 field (k,v) = variable k <+> P.text "<-" <+> pretty v
184− Record fs ->
186+ Record fields ->
186− [ P.cat (zipWith (<+>) (P.lbrace : repeat P.comma) (map field fs))
188+ [ P.cat (zipWith (<+>) (P.lbrace : repeat P.comma) (map field fields))
187 , P.rbrace
189 , P.rbrace
190− field (name, value) =
192+ field (name, expr) =
191− variable name <+> P.equals <+> pretty value
193+ variable name <+> P.equals <+> pretty expr
193 GLShader _ _ _ ->
195 GLShader _ _ _ ->
194 P.text "[glsl| ... |]"
196 P.text "[glsl| ... |]"
@@ -196,6 +198,9 @@ instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var
196 Port name _ ->
198 Port name _ ->
197 P.text ("<port:" ++ name ++ ">")
199 P.text ("<port:" ++ name ++ ">")
202+ P.text "perform" <+> pretty expr
200collectApps :: Expr ann def var -> [Expr ann def var]
205collectApps :: Expr ann def var -> [Expr ann def var]
201collectApps annExpr@(Annotation.A _ expr) =
206collectApps annExpr@(Annotation.A _ expr) =