Compare commits
8 commits
93e20cf208
...
2e551ab2c7
Author | SHA1 | Date | |
---|---|---|---|
2e551ab2c7 | |||
89e4cde17f | |||
20d09abe2a | |||
75522128da | |||
04d1ec3555 | |||
86b097171e | |||
251bfd4b7d | |||
0939615350 |
10 changed files with 23 additions and 12 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "src/tests_shared"]
|
||||||
|
path = src/tests_shared
|
||||||
|
url = git@github.com:tobast/mpri18-funcprog-tests.git
|
23
src/CPS.ml
23
src/CPS.ml
|
@ -35,16 +35,8 @@ let rec has_calls (t: S.term): bool = match t with
|
||||||
(* A lambda itself may contain calls, but this call is not evaluated at
|
(* A lambda itself may contain calls, but this call is not evaluated at
|
||||||
* declaration time *)
|
* declaration time *)
|
||||||
| S.App _ -> true
|
| S.App _ -> true
|
||||||
| S.IfZero (cond, tIf, tElse) ->
|
| S.IfZero _ -> true (* Cannot optimize that with the current languages *)
|
||||||
(* Cannot optimize continuation creation
|
| S.Print _ -> true (* Cannot optimize that with the current languages *)
|
||||||
List.exists has_calls [cond; tIf; tElse]
|
|
||||||
*)
|
|
||||||
true
|
|
||||||
| S.Print value ->
|
|
||||||
(* Cannot optimize continuation creation
|
|
||||||
has_calls value
|
|
||||||
*)
|
|
||||||
true
|
|
||||||
| S.Let (_, value, next) ->
|
| S.Let (_, value, next) ->
|
||||||
List.exists has_calls [value; next]
|
List.exists has_calls [value; next]
|
||||||
|
|
||||||
|
@ -61,7 +53,16 @@ let rec cps_term_inner (t: S.term) (cont: T.variable) (nameHint: string option)
|
||||||
: T.term = match t with
|
: T.term = match t with
|
||||||
| S.Var _ -> cps_value_as_term t cont
|
| S.Var _ -> cps_value_as_term t cont
|
||||||
| S.Lit _ -> cps_value_as_term t cont
|
| S.Lit _ -> cps_value_as_term t cont
|
||||||
| S.BinOp _ -> cps_value_as_term t cont
|
| S.BinOp (t1, op, t2) ->
|
||||||
|
(try cps_value_as_term t cont
|
||||||
|
with NotValue _ -> (
|
||||||
|
let t1Var = freshVar ()
|
||||||
|
and t2Var = freshVar () in
|
||||||
|
light_term t1Var t1 None @@
|
||||||
|
light_term t2Var t2 None @@
|
||||||
|
T.TailCall(T.vvar cont,
|
||||||
|
[T.VBinOp(T.vvar t1Var, op, T.vvar t2Var)])
|
||||||
|
))
|
||||||
| S.Lam _ as lambda ->
|
| S.Lam _ as lambda ->
|
||||||
let fName = freshBlockVarHinted nameHint in
|
let fName = freshBlockVarHinted nameHint in
|
||||||
light_term fName lambda None @@
|
light_term fName lambda None @@
|
||||||
|
|
1
src/tests/if_fib.exp
Symbolic link
1
src/tests/if_fib.exp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../tests_shared/if_fib.exp
|
1
src/tests/if_fib.lambda
Symbolic link
1
src/tests/if_fib.lambda
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../tests_shared/if_fib.lambda
|
1
src/tests/if_nested.exp
Symbolic link
1
src/tests/if_nested.exp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../tests_shared/if_nested.exp
|
1
src/tests/if_nested.lambda
Symbolic link
1
src/tests/if_nested.lambda
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../tests_shared/if_nested.lambda
|
|
@ -1,2 +1,2 @@
|
||||||
let sum = fun x -> fun y -> x + y in
|
let sum = fun x -> fun y -> x + y in
|
||||||
print(40 + 2)
|
print(sum 40 2)
|
||||||
|
|
1
src/tests/ren.exp
Symbolic link
1
src/tests/ren.exp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../tests_shared/ren.exp
|
1
src/tests/ren.lambda
Symbolic link
1
src/tests/ren.lambda
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../tests_shared/ren.lambda
|
1
src/tests_shared
Submodule
1
src/tests_shared
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ab7549347e5b6b51183c5704048c6768aab23d86
|
Loading…
Reference in a new issue