@@ -1,8 +1,11 @@
1+{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
1module Optimize (optimize) where
3module Optimize (optimize) where
3import qualified Control.Monad as M
5import qualified Control.Monad as M
4import qualified Data.Map as Map
6import qualified Data.Map as Map
5import qualified Data.Traversable as T
7import qualified Data.Traversable as T
8+import Data.Text (Text)
7import qualified AST.Expression.Canonical as Can
10import qualified AST.Expression.Canonical as Can
8import qualified AST.Expression.Optimized as Opt
11import qualified AST.Expression.Optimized as Opt
@@ -53,18 +56,18 @@ optimizeDefHelp
53 -> [P.Canonical]
56 -> [P.Canonical]
54 -> Can.Expr
57 -> Can.Expr
55 -> Env.Optimizer [Opt.Def]
58 -> Env.Optimizer [Opt.Def]
56−optimizeDefHelp home pattern@(A.A _ ptrn) args rawBody =
59+optimizeDefHelp home pattern@(A.A _ ptrn) rawArgs rawBody =
59 Opt.Facts home
62 Opt.Facts home
61− case (ptrn, args) of
64+ case (ptrn, rawArgs) of
62 (P.Var name, _ : _) ->
65 (P.Var name, _ : _) ->
64 do htc <- Env.getTailCall
67 do htc <- Env.getTailCall
65 Env.setTailCall False
68 Env.setTailCall False
67− (args, body) <- optimizeFunction (Just name) args rawBody
70+ (args, body) <- optimizeFunction (Just name) rawArgs rawBody
69 isTailCall <- Env.getTailCall
72 isTailCall <- Env.getTailCall
70 Env.setTailCall htc
73 Env.setTailCall htc
@@ -99,28 +102,28 @@ optimizeDefHelp home pattern@(A.A _ ptrn) args rawBody =
101optimizeFunction
104optimizeFunction
102− :: Maybe String
105+ :: Maybe Text
103 -> [P.Canonical]
106 -> [P.Canonical]
104 -> Can.Expr
107 -> Can.Expr
105− -> Env.Optimizer ([String], Opt.Expr)
108+ -> Env.Optimizer ([Text], Opt.Expr)
106optimizeFunction maybeName patterns givenBody =
109optimizeFunction maybeName patterns givenBody =
107 do (argNames, body) <- M.foldM depatternArgs ([], givenBody) (reverse patterns)
110 do (argNames, body) <- M.foldM depatternArgs ([], givenBody) (reverse patterns)
108 optBody <- optimizeExpr (makeContext argNames =<< maybeName) body
111 optBody <- optimizeExpr (makeContext argNames =<< maybeName) body
109 return (argNames, optBody)
112 return (argNames, optBody)
112−makeContext :: [String] -> String -> Context
115+makeContext :: [Text] -> Text -> Context
113makeContext argNames name =
116makeContext argNames name =
114 Just (name, length argNames, argNames)
117 Just (name, length argNames, argNames)
117−depatternArgs :: ([String], Can.Expr) -> P.Canonical -> Env.Optimizer ([String], Can.Expr)
120+depatternArgs :: ([Text], Can.Expr) -> P.Canonical -> Env.Optimizer ([Text], Can.Expr)
118depatternArgs (names, rawExpr) ptrn =
121depatternArgs (names, rawExpr) ptrn =
119 do (name, expr) <- depattern ptrn rawExpr
122 do (name, expr) <- depattern ptrn rawExpr
120 return (name : names, expr)
123 return (name : names, expr)
123−patternToDefs :: Maybe ModuleName.Canonical -> String -> P.Canonical -> [Opt.Def]
126+patternToDefs :: Maybe ModuleName.Canonical -> Text -> P.Canonical -> [Opt.Def]
124patternToDefs home rootName pattern =
127patternToDefs home rootName pattern =
126 rootExpr =
129 rootExpr =
@@ -141,7 +144,7 @@ patternToDefs home rootName pattern =
141-- TURN A PATTERN INTO A BUNCH OF SUBSTITUTIONS
144-- TURN A PATTERN INTO A BUNCH OF SUBSTITUTIONS
144−patternToSubstitutions :: Opt.Expr -> P.Canonical -> [(String, Opt.Expr)]
147+patternToSubstitutions :: Opt.Expr -> P.Canonical -> [(Text, Opt.Expr)]
145patternToSubstitutions expr (A.A _ pattern) =
148patternToSubstitutions expr (A.A _ pattern) =
146 case pattern of
149 case pattern of
147 P.Var name ->
150 P.Var name ->
@@ -159,7 +162,7 @@ patternToSubstitutions expr (A.A _ pattern) =
159 P.Alias alias realPattern ->
162 P.Alias alias realPattern ->
160 (alias, expr) : patternToSubstitutions expr realPattern
163 (alias, expr) : patternToSubstitutions expr realPattern
162− P.Data _ patterns ->
165+ P.Ctor _ patterns ->
163 concat (zipWith (patternToSubstitutions . Opt.CtorAccess expr) [0..] patterns)
166 concat (zipWith (patternToSubstitutions . Opt.CtorAccess expr) [0..] patterns)
@@ -167,7 +170,7 @@ patternToSubstitutions expr (A.A _ pattern) =
167-- OPTIMIZE EXPRESSIONS
170-- OPTIMIZE EXPRESSIONS
170−type Context = Maybe (String, Int, [String])
173+type Context = Maybe (Text, Int, [Text])
173{-| This optimizer detects tail calls. The `Context` holds a function name,
176{-| This optimizer detects tail calls. The `Context` holds a function name,
@@ -193,7 +196,7 @@ optimizeExpr context annExpr@(A.A region expression) =
193 pure (Opt.Literal lit)
196 pure (Opt.Literal lit)
195 Can.Var name ->
198 Can.Var name ->
196− if name == Var.inCore ["Debug"] "crash" then
199+ if name == Var.inCore "Debug" "crash" then
197 do home <- Env.getHome
200 do home <- Env.getHome
198 pure (Opt.Crash home region Nothing)
201 pure (Opt.Crash home region Nothing)
@@ -219,7 +222,7 @@ optimizeExpr context annExpr@(A.A region expression) =
219 (func:args) =
222 (func:args) =
220 Can.collectApps annExpr
223 Can.collectApps annExpr
222− case isTailCall context func (length args) of
225+ case getTailCallInfo context func (length args) of
223 Just (name, argNames) ->
226 Just (name, argNames) ->
224 do optArgs <- T.traverse justConvert args
227 do optArgs <- T.traverse justConvert args
225 Env.setTailCall True
228 Env.setTailCall True
@@ -254,7 +257,7 @@ optimizeExpr context annExpr@(A.A region expression) =
254 let optCase = Case.optimize variantDict name optBranches
257 let optCase = Case.optimize variantDict name optBranches
255 return $ Opt.Let [ Opt.Def Opt.dummyFacts name optExpr ] optCase
258 return $ Opt.Let [ Opt.Def Opt.dummyFacts name optExpr ] optCase
257− Can.Ctor name exprs ->
260+ Can.Ctor (Var.Canonical _ name) exprs ->
258 Opt.Ctor name <$> T.traverse justConvert exprs
261 Opt.Ctor name <$> T.traverse justConvert exprs
260 Can.Access record field ->
263 Can.Access record field ->
@@ -305,7 +308,7 @@ mapSnd func (x, a) =
305optimizeBranch
308optimizeBranch
306 :: Context
309 :: Context
307 -> R.Region
310 -> R.Region
308− -> String
311+ -> Text
309 -> (P.Canonical, Can.Expr)
312 -> (P.Canonical, Can.Expr)
310 -> Env.Optimizer (P.Canonical, Opt.Expr)
313 -> Env.Optimizer (P.Canonical, Opt.Expr)
311optimizeBranch context region exprName (rawPattern, canBranch) =
314optimizeBranch context region exprName (rawPattern, canBranch) =
@@ -344,8 +347,8 @@ tagCrashBranch region pattern@(A.A pr _) expr =
344-- DETECT TAIL CALL
347-- DETECT TAIL CALL
347−isTailCall :: Context -> Can.Expr -> Int -> Maybe (String, [String])
350+getTailCallInfo :: Context -> Can.Expr -> Int -> Maybe (Text, [Text])
348−isTailCall context (A.A _ function) arity =
351+getTailCallInfo context (A.A _ function) arity =
349 case (context, function) of
352 case (context, function) of
350 ( Just (ctxName, ctxArity, argNames), Can.Var (Var.Canonical home name) ) ->
353 ( Just (ctxName, ctxArity, argNames), Can.Var (Var.Canonical home name) ) ->
@@ -366,7 +369,7 @@ isTailCall context (A.A _ function) arity =
366-- it out from there
369-- it out from there
369−depattern :: P.Canonical -> Can.Expr -> Env.Optimizer (String, Can.Expr)
372+depattern :: P.Canonical -> Can.Expr -> Env.Optimizer (Text, Can.Expr)
370depattern canPattern@(A.A _ pattern) expr =
373depattern canPattern@(A.A _ pattern) expr =
@@ -402,7 +405,7 @@ depattern canPattern@(A.A _ pattern) expr =
402 P.Alias _ _ ->
405 P.Alias _ _ ->
405− P.Data _ _ ->
408+ P.Ctor _ _ ->
@@ -444,9 +447,9 @@ optimizeBinop context region op leftExpr rightExpr =
444 let body = collect makeRoot right backwardCompose binop
447 let body = collect makeRoot right backwardCompose binop
445 optimizeExpr context (ann (Can.Lambda (ann (P.Var var)) body))
448 optimizeExpr context (ann (Can.Lambda (ann (P.Var var)) body))
447− else if op == Var.Canonical Var.BuiltIn "::" then
450+ else if op == cons then
449− optimizeExpr context (ann (Can.Ctor "::" [ leftExpr, rightExpr ]))
452+ optimizeExpr context (ann (Can.Ctor cons [ leftExpr, rightExpr ]))
@@ -458,25 +461,30 @@ optimizeBinop context region op leftExpr rightExpr =
458-- left-associative ((x |> f) |> g)
461-- left-associative ((x |> f) |> g)
459forwardApply :: Var.Canonical
462forwardApply :: Var.Canonical
460forwardApply =
463forwardApply =
461− Var.inCore ["Basics"] "|>"
464+ Var.inCore "Basics" "|>"
464-- right-associative (g <| (f <| x))
467-- right-associative (g <| (f <| x))
465backwardApply :: Var.Canonical
468backwardApply :: Var.Canonical
466backwardApply =
469backwardApply =
467− Var.inCore ["Basics"] "<|"
470+ Var.inCore "Basics" "<|"
470-- left-associative ((f >> g) >> h)
473-- left-associative ((f >> g) >> h)
471forwardCompose :: Var.Canonical
474forwardCompose :: Var.Canonical
472forwardCompose =
475forwardCompose =
473− Var.inCore ["Basics"] ">>"
476+ Var.inCore "Basics" ">>"
476-- right-associative (h << (g << f))
479-- right-associative (h << (g << f))
477backwardCompose :: Var.Canonical
480backwardCompose :: Var.Canonical
478backwardCompose =
481backwardCompose =
479− Var.inCore ["Basics"] "<<"
482+ Var.inCore "Basics" "<<"
485+cons :: Var.Canonical
487+ Var.Canonical Var.BuiltIn "::"
482type Assoc =
490type Assoc =