-
Notifications
You must be signed in to change notification settings - Fork 4
/
LambdaCalculusTransformer.hs
73 lines (53 loc) · 2.46 KB
/
LambdaCalculusTransformer.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
module LambdaCalculusTransformer where
import Common
import ParserTypes
import LetTransformer
import CaseTransformer
import PatternMatching
import ParserTypes
import NameSupply
transformToLambdaCalculus :: PatProgram -> CoreProgram
transformToLambdaCalculus = transform . (traverse transformCase) . patternMatch . (traverse transformLet)
-- generic program traversal function
traverse :: ([DataType] -> Expr Pattern -> Expr Pattern)
-> ([DataType], [PatScDefn])
-> ([DataType], [PatScDefn])
traverse transformFunction (adts, scs) = (adts, scs')
where
scs' = [PatScDefn name $ traverseEqs (transformFunction adts) eqs | (PatScDefn name eqs) <- scs]
traverseEqs :: (Expr Pattern -> Expr Pattern) -> [Equation] -> [Equation]
traverseEqs transformFunction eqs = [traverseEq transformFunction eq | eq <- eqs]
traverseEq :: (Expr Pattern -> Expr Pattern) -> Equation -> Equation
traverseEq transformFunction (patterns, expr) = (patterns, transformFunction expr)
transformPattern :: Pattern -> String
transformPattern (PVar v) = v
transformPattern pattern = error $ "Unexpected pattern found when transforming into lambda calculus: " ++ show pattern
transform :: PatProgram -> CoreProgram
transform (adts, scs) = (adts, [transformSc sc | sc <- scs])
transformSc :: PatScDefn -> CoreScDefn
transformSc (PatScDefn name [(patterns, expr)]) =
ScDefn name [transformPattern pattern | pattern <- patterns] $ transformExpr expr
transformExpr :: Expr Pattern -> CoreExpr
transformExpr (ENum n) = ENum n
transformExpr (EChar n) = EChar n
transformExpr (EVar v) = EVar v
transformExpr (EConstr t a) = EConstr t a
transformExpr (EAp e1 e2) = EAp (transformExpr e1) (transformExpr e2)
transformExpr (ELam patterns expr) = ELam patterns' expr'
where
patterns' = [transformPattern pattern | pattern <- patterns]
expr' = transformExpr expr
transformExpr (ELet isRec defns expr) = ELet isRec defns' expr'
where
expr' = transformExpr expr
defns' = [(transformPattern pattern, transformExpr rhs) | (pattern, rhs) <- defns]
transformExpr (ECaseSimple expr alts) = ECaseSimple expr' alts'
where
expr' = transformExpr expr
alts' = [(n, transformExpr expr) | (n, expr) <- alts]
transformExpr (ECaseConstr expr alts) = ECaseConstr expr' alts'
where
expr' = transformExpr expr
alts' = [(n, transformExpr expr) | (n, expr) <- alts]
transformExpr (ESelect r i v) = ESelect r i v
transformExpr (EError msg) = EError msg