Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Sebastiaan Visser
committed
Dec 20, 2009
1 parent
e7592d6
commit 138ede6
Showing
11 changed files
with
165 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
module Compiler.CommonDefinitions where | ||
|
||
import Compiler.Expr | ||
import Compiler.Generics | ||
import Compiler.LiftDefinitions | ||
import Control.Arrow hiding (app) | ||
import Data.Either | ||
import Prelude hiding (lookup) | ||
|
||
eliminate :: Arrow (~>) => Definitions ~> Definitions | ||
eliminate = arr (Defs . fixpoint f . unDefs) | ||
where | ||
f [] = [] | ||
f (d:ds) = d : eliminate1 d (f ds) | ||
|
||
eliminate1 :: Definition -> [Definition] -> [Definition] | ||
eliminate1 (Def n e) ds = | ||
let (subs, keeps) = partitionEithers (map part ds) | ||
part (Def m g) = if g == e && m /= n then Left m else Right (Def m g) | ||
in map (\(Def m g) -> Def m (foldr (substitute1 n) g subs)) keeps | ||
|
||
substitute1 :: Var -> Var -> Expr -> Expr | ||
substitute1 to from = rec | ||
where | ||
tr (App f e ) = app (rec f) (rec e) | ||
tr (Con c ) = con c | ||
tr (Lam ps e) = lam ps (rec e) | ||
tr (Name n e ) = name n (rec e) | ||
tr (Prim s vs) = prim s (map rep vs) | ||
tr (Var u ) = var (rep u) | ||
|
||
rep u = if u == from then to else u | ||
rec = tr . unId . out |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
module Compiler.ReindexParamaters where | ||
|
||
import Compiler.Expr | ||
import Compiler.Generics | ||
import Compiler.LiftDefinitions | ||
import Control.Applicative hiding (empty) | ||
import Control.Arrow hiding (app) | ||
import Control.Monad.State | ||
import Data.Map (Map, insert, lookup, empty) | ||
import Data.Maybe | ||
import Prelude hiding (lookup) | ||
|
||
reindex :: Arrow (~>) => Definitions ~> Definitions | ||
reindex = arr (Defs . map one . unDefs) | ||
where | ||
|
||
one (Def nm x) = let e = fst $ runState (rec x) (0, empty) in Def nm e | ||
where | ||
|
||
tr :: ExprF Expr -> State (Integer, Map Var Integer) Expr | ||
tr (App f e ) = app <$> rec f <*> rec e | ||
tr (Con c ) = return (con c) | ||
tr (Lam ps e) = do qs <- mapM (\p -> modify (\(c, m) -> (c + 1, insert p (c + 1) m)) >> gets (mk . fst)) ps | ||
lam qs <$> rec e | ||
tr (Name n e ) = name n <$> rec e | ||
tr (Prim s vs) = prim s <$> mapM subst vs | ||
tr (Var v ) = subst v >>= return . var | ||
|
||
rec = tr . unId . out | ||
mk = ('v':) . show | ||
subst v = gets (maybe v mk . lookup v . snd) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,35 +1,41 @@ | ||
var mul = /* mul */ function (v1) { return function (v2) { return v1 * v2; }; } | ||
var fix = /* fix */ function (v1) { return fix = arguments.callee, v1(function (i) { return fix(v1)(i) }); } | ||
var list = /* list */ function (v3) { return function (v4) { return function (v5) { return v5.nil ? v3 : v4(v5.head)(v5.tail); }; }; } | ||
var add = /* add */ function (v5) { return function (v6) { return v5 + v6; }; } | ||
var bool = /* bool */ function (v5) { return function (v6) { return function (v7) { return v7 ? v5(/*force*/) : v6(/*force*/); }; }; } | ||
var cons = /* cons */ function (v6) { return function (v7) { return { head : v6, tail : v7 }; }; } | ||
var sub = /* sub */ function (v6) { return function (v7) { return v6 - v7; }; } | ||
var eq = /* eq */ function (v5) { return function (v6) { return v5 == v6; }; } | ||
var maybe = /* maybe */ function (v1) { return function (v2) { return function (v3) { return v3.nothing ? v1 : v2(v3.just); }; }; } | ||
var just = /* just */ function (v1) { return { just : v1 }; } | ||
var c1 = list(0) | ||
var c2 = fix(function (v1) { return function (v2) { return c1(function (v3) { return function (v4) { return add(v3)(v1(v4)); }; })(v2); }; }) | ||
var c3 = function (v6) { return function (v7) { return v6; }; }({ nil : 1 }) | ||
var c4 = bool(function (v5) { return c3(v5); }) | ||
var c5 = cons(8) | ||
var c6 = fix(function (v3) { return function (v4) { return c4(function (v5) { return function (v6) { return function (v7) { return v6; }; }(c5(v3(sub(v4)(1))))(v5); })(eq(v4)(0)); }; }) | ||
var c7 = c6(3) | ||
var c8 = list(c7) | ||
var c9 = fix(function (v1) { return function (v2) { return c8(function (v3) { return function (v4) { return cons(v3)(v1(v4)); }; })(v2); }; }) | ||
var c10 = function (v4) { return function (v5) { return v4; }; }({ nil : 1 }) | ||
var c11 = bool(function (v3) { return c10(v3); }) | ||
var c12 = cons(8) | ||
var c13 = fix(function (v1) { return function (v2) { return c11(function (v3) { return function (v4) { return function (v5) { return v4; }; }(c12(v1(sub(v2)(1))))(v3); })(eq(v2)(0)); }; }) | ||
var c14 = c13(3) | ||
var c15 = c9(c14) | ||
var c16 = c2(c15) | ||
var c17 = mul(c16) | ||
var c18 = maybe(4) | ||
var c19 = c18(function (v1) { return mul(v1)(8); }) | ||
var c20 = sub(3) | ||
var c21 = c20(2) | ||
var c22 = just(c21) | ||
var c23 = c19(c22) | ||
var c24 = c17(c23) | ||
var __main = c24 | ||
var mul = function (v1) { return function (v2) { return v1 * v2; }; } | ||
var fix = function (v1) { return fix = arguments.callee, v1(function (i) { return fix(v1)(i) }); } | ||
var list = function (v1) { return function (v2) { return function (v3) { return v3.nil ? v1 : v2(v3.head)(v3.tail); }; }; } | ||
var add = function (v1) { return function (v2) { return v1 + v2; }; } | ||
var bool = function (v1) { return function (v2) { return function (v3) { return v3 ? v1(/*force*/) : v2(/*force*/); }; }; } | ||
var cons = function (v1) { return function (v2) { return { head : v1, tail : v2 }; }; } | ||
var sub = function (v1) { return function (v2) { return v1 - v2; }; } | ||
var eq = function (v1) { return function (v2) { return v1 == v2; }; } | ||
var maybe = function (v1) { return function (v2) { return function (v3) { return v3.nothing ? v1 : v2(v3.just); }; }; } | ||
var just = function (v1) { return { just : v1 }; } | ||
var c10_11 = list(0) | ||
var c10_12 = function (v1) { return function (v2) { return c10_11(function (v3) { return function (v4) { return add(v3)(v1(v4)); }; })(v2); }; } | ||
var c10_13 = fix(c10_12) | ||
var c10_14 = function (v1) { return function (v2) { return v1; }; } | ||
var c10_15 = c10_14({ nil : 1 }) | ||
var c10_16 = function (v1) { return c10_15(v1); } | ||
var c10_17 = bool(c10_16) | ||
var c10_19 = cons(8) | ||
var c10_20 = function (v1) { return function (v2) { return c10_17(function (v3) { return c10_14(c10_19(v1(sub(v2)(1))))(v3); })(eq(v2)(0)); }; } | ||
var c10_21 = fix(c10_20) | ||
var c10_22 = c10_21(3) | ||
var c10_23 = list(c10_22) | ||
var c10_24 = function (v1) { return function (v2) { return c10_23(function (v3) { return function (v4) { return cons(v3)(v1(v4)); }; })(v2); }; } | ||
var c10_25 = fix(c10_24) | ||
var c10_31 = mul(2) | ||
var c10_32 = c10_31(8) | ||
var c10_33 = cons(c10_32) | ||
var c10_34 = function (v1) { return function (v2) { return c10_17(function (v3) { return c10_14(c10_33(v1(sub(v2)(1))))(v3); })(eq(v2)(0)); }; } | ||
var c10_35 = fix(c10_34) | ||
var c10_36 = c10_35(3) | ||
var c10_37 = c10_25(c10_36) | ||
var c10_38 = c10_13(c10_37) | ||
var c10_39 = mul(c10_38) | ||
var c10_40 = maybe(4) | ||
var c10_41 = function (v1) { return mul(v1)(8); } | ||
var c10_42 = c10_40(c10_41) | ||
var c10_43 = sub(3) | ||
var c10_44 = c10_43(2) | ||
var c10_45 = just(c10_44) | ||
var c10_46 = c10_42(c10_45) | ||
var __main = c10_39(c10_46) |