@@ -1,8 +1,11 @@
1+{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
13module Optimize (optimize) where
24
35import qualified Control.Monad as M
46import qualified Data.Map as Map
57import qualified Data.Traversable as T
8+import Data.Text (Text)
69
710import qualified AST.Expression.Canonical as Can
811import qualified AST.Expression.Optimized as Opt
@@ -53,18 +56,18 @@ optimizeDefHelp
5356 -> [P.Canonical]
5457 -> Can.Expr
5558 -> Env.Optimizer [Opt.Def]
56−optimizeDefHelp home pattern@(A.A _ ptrn) args rawBody =
59+optimizeDefHelp home pattern@(A.A _ ptrn) rawArgs rawBody =
5760 let
5861 facts =
5962 Opt.Facts home
6063 in
61− case (ptrn, args) of
64+ case (ptrn, rawArgs) of
6265 (P.Var name, _ : _) ->
6366
6467 do htc <- Env.getTailCall
6568 Env.setTailCall False
6669
67− (args, body) <- optimizeFunction (Just name) args rawBody
70+ (args, body) <- optimizeFunction (Just name) rawArgs rawBody
6871
6972 isTailCall <- Env.getTailCall
7073 Env.setTailCall htc
@@ -99,28 +102,28 @@ optimizeDefHelp home pattern@(A.A _ ptrn) args rawBody =
99102
100103
101104optimizeFunction
102− :: Maybe String
105+ :: Maybe Text
103106 -> [P.Canonical]
104107 -> Can.Expr
105− -> Env.Optimizer ([String], Opt.Expr)
108+ -> Env.Optimizer ([Text], Opt.Expr)
106109optimizeFunction maybeName patterns givenBody =
107110 do (argNames, body) <- M.foldM depatternArgs ([], givenBody) (reverse patterns)
108111 optBody <- optimizeExpr (makeContext argNames =<< maybeName) body
109112 return (argNames, optBody)
110113
111114
112−makeContext :: [String] -> String -> Context
115+makeContext :: [Text] -> Text -> Context
113116makeContext argNames name =
114117 Just (name, length argNames, argNames)
115118
116119
117−depatternArgs :: ([String], Can.Expr) -> P.Canonical -> Env.Optimizer ([String], Can.Expr)
120+depatternArgs :: ([Text], Can.Expr) -> P.Canonical -> Env.Optimizer ([Text], Can.Expr)
118121depatternArgs (names, rawExpr) ptrn =
119122 do (name, expr) <- depattern ptrn rawExpr
120123 return (name : names, expr)
121124
122125
123−patternToDefs :: Maybe ModuleName.Canonical -> String -> P.Canonical -> [Opt.Def]
126+patternToDefs :: Maybe ModuleName.Canonical -> Text -> P.Canonical -> [Opt.Def]
124127patternToDefs home rootName pattern =
125128 let
126129 rootExpr =
@@ -141,7 +144,7 @@ patternToDefs home rootName pattern =
141144-- TURN A PATTERN INTO A BUNCH OF SUBSTITUTIONS
142145
143146
144−patternToSubstitutions :: Opt.Expr -> P.Canonical -> [(String, Opt.Expr)]
147+patternToSubstitutions :: Opt.Expr -> P.Canonical -> [(Text, Opt.Expr)]
145148patternToSubstitutions expr (A.A _ pattern) =
146149 case pattern of
147150 P.Var name ->
@@ -159,7 +162,7 @@ patternToSubstitutions expr (A.A _ pattern) =
159162 P.Alias alias realPattern ->
160163 (alias, expr) : patternToSubstitutions expr realPattern
161164
162− P.Data _ patterns ->
165+ P.Ctor _ patterns ->
163166 concat (zipWith (patternToSubstitutions . Opt.CtorAccess expr) [0..] patterns)
164167
165168
@@ -167,7 +170,7 @@ patternToSubstitutions expr (A.A _ pattern) =
167170-- OPTIMIZE EXPRESSIONS
168171
169172
170−type Context = Maybe (String, Int, [String])
173+type Context = Maybe (Text, Int, [Text])
171174
172175
173176{-| This optimizer detects tail calls. The `Context` holds a function name,
@@ -193,7 +196,7 @@ optimizeExpr context annExpr@(A.A region expression) =
193196 pure (Opt.Literal lit)
194197
195198 Can.Var name ->
196− if name == Var.inCore ["Debug"] "crash" then
199+ if name == Var.inCore "Debug" "crash" then
197200 do home <- Env.getHome
198201 pure (Opt.Crash home region Nothing)
199202
@@ -219,7 +222,7 @@ optimizeExpr context annExpr@(A.A region expression) =
219222 (func:args) =
220223 Can.collectApps annExpr
221224 in
222− case isTailCall context func (length args) of
225+ case getTailCallInfo context func (length args) of
223226 Just (name, argNames) ->
224227 do optArgs <- T.traverse justConvert args
225228 Env.setTailCall True
@@ -254,7 +257,7 @@ optimizeExpr context annExpr@(A.A region expression) =
254257 let optCase = Case.optimize variantDict name optBranches
255258 return $ Opt.Let [ Opt.Def Opt.dummyFacts name optExpr ] optCase
256259
257− Can.Ctor name exprs ->
260+ Can.Ctor (Var.Canonical _ name) exprs ->
258261 Opt.Ctor name <$> T.traverse justConvert exprs
259262
260263 Can.Access record field ->
@@ -305,7 +308,7 @@ mapSnd func (x, a) =
305308optimizeBranch
306309 :: Context
307310 -> R.Region
308− -> String
311+ -> Text
309312 -> (P.Canonical, Can.Expr)
310313 -> Env.Optimizer (P.Canonical, Opt.Expr)
311314optimizeBranch context region exprName (rawPattern, canBranch) =
@@ -344,8 +347,8 @@ tagCrashBranch region pattern@(A.A pr _) expr =
344347-- DETECT TAIL CALL
345348
346349
347−isTailCall :: Context -> Can.Expr -> Int -> Maybe (String, [String])
348−isTailCall context (A.A _ function) arity =
350+getTailCallInfo :: Context -> Can.Expr -> Int -> Maybe (Text, [Text])
351+getTailCallInfo context (A.A _ function) arity =
349352 case (context, function) of
350353 ( Just (ctxName, ctxArity, argNames), Can.Var (Var.Canonical home name) ) ->
351354
@@ -366,7 +369,7 @@ isTailCall context (A.A _ function) arity =
366369-- it out from there
367370
368371
369−depattern :: P.Canonical -> Can.Expr -> Env.Optimizer (String, Can.Expr)
372+depattern :: P.Canonical -> Can.Expr -> Env.Optimizer (Text, Can.Expr)
370373depattern canPattern@(A.A _ pattern) expr =
371374 let
372375 ann =
@@ -402,7 +405,7 @@ depattern canPattern@(A.A _ pattern) expr =
402405 P.Alias _ _ ->
403406 caseify
404407
405− P.Data _ _ ->
408+ P.Ctor _ _ ->
406409 caseify
407410
408411
@@ -444,9 +447,9 @@ optimizeBinop context region op leftExpr rightExpr =
444447 let body = collect makeRoot right backwardCompose binop
445448 optimizeExpr context (ann (Can.Lambda (ann (P.Var var)) body))
446449
447− else if op == Var.Canonical Var.BuiltIn "::" then
450+ else if op == cons then
448451
449− optimizeExpr context (ann (Can.Ctor "::" [ leftExpr, rightExpr ]))
452+ optimizeExpr context (ann (Can.Ctor cons [ leftExpr, rightExpr ]))
450453
451454 else
452455
@@ -458,25 +461,30 @@ optimizeBinop context region op leftExpr rightExpr =
458461-- left-associative ((x |> f) |> g)
459462forwardApply :: Var.Canonical
460463forwardApply =
461− Var.inCore ["Basics"] "|>"
464+ Var.inCore "Basics" "|>"
462465
463466
464467-- right-associative (g <| (f <| x))
465468backwardApply :: Var.Canonical
466469backwardApply =
467− Var.inCore ["Basics"] "<|"
470+ Var.inCore "Basics" "<|"
468471
469472
470473-- left-associative ((f >> g) >> h)
471474forwardCompose :: Var.Canonical
472475forwardCompose =
473− Var.inCore ["Basics"] ">>"
476+ Var.inCore "Basics" ">>"
474477
475478
476479-- right-associative (h << (g << f))
477480backwardCompose :: Var.Canonical
478481backwardCompose =
479− Var.inCore ["Basics"] "<<"
482+ Var.inCore "Basics" "<<"
483+
484+
485+cons :: Var.Canonical
486+cons =
487+ Var.Canonical Var.BuiltIn "::"
480488
481489
482490type Assoc =