Ken Wakita (https://wakita.github.io/fp2018/)
Oct. 25, 2018
let rec iter n e = (* Iterative optimization *)
if n = 0 then e else
let e' = Elim.f (ConstFold.f (Inline.f (Assoc.f (Beta.f e)))) in
if e = e' then e else
iter (n - 1) e'
let lexbuf outchan l =
...... .......
(..........
(......
(.........
(.........
(iter !limit
(.......
(.........
(........
(.......... ........... .)))))))))
\[ \beta_\varepsilon(\text {let } x = e_1 \text { in } e_2) = \begin {cases} \beta_{\color {red} {\varepsilon, x \mapsto y}}(e_2) & \beta_\varepsilon(e_1) \text { is a variable (y)}\\ \text {let } x = \beta_\varepsilon(e_1) \text { in } \beta_\varepsilon(e_2) & \text {Otherwise} \end {cases} \]
When a let
expression is an alias/renaming (\(x \mapsto y\)), the let
is removed and occurrences of \(x\) in \(e_2\) are substituted by \(y\).
Beta.g : (Id.t M.t) -> KNormal.t -> KNormal.t
| Let((x, t), e1, e2) -> (* Beta-reduction of `let` expressions *)
(match g env e1 with
| Var(y) ->
Format.eprintf "beta-reducing %s = %s@." x y;
g (M.add x y env) e2
| e1' ->
let e2' = g env e2 in
Let((x, t), e1', e2'))
\[ \beta_\varepsilon(\text {let } x = e_1 \text { in } e_2) = \begin {cases} \beta_{\varepsilon, x \mapsto y}(e_2) & \beta_\varepsilon(e_1) \text { is a variable (y)}\\ \text {let } x = \beta_\varepsilon(e_1) \text { in } \beta_\varepsilon(e_2) & \text {Otherwise} \end {cases} \]
\[ {\cal A}(\text {let } x = e_1 \text { in } e_2) = \text {let ... in let } x = e_1' in {\cal A}(e_2) \]
\({\cal A}(e_1)\) is a nested let
form (\(\text {let ... in } e'\), where \(\text {let ... }\) is a sequence of one or more let
’s), and \(e_1'\) is not a let
form.
where
(* alpha assoc_letrec_p *)
Let (Ti3_4,
Let (x_5,
LetRec
({name = f_6; args = [x_7];
body = Let (Ti2_9, 1, Add (x_7, Ti2_9))},
Let (Ti1_8, 1, App (f_6, [Ti1_8]))),
Var x_5), ...)
(* assoc assoc_letrec_p *)
LetRec
({name = f_15; args = [x_16];
body = Let (Ti11_18, 1, Add (x_16, Ti11_18))},
Let (Ti10_17, 1,
Let (x_14, App (f_15, [Ti10_17]),
Let (Ti12_13, x_14, ...))))
Let (Ti3_4, (* alpha assoc_tuple_p *)
Let (x_5,
Let (Ti1_8, 1,
Let (Ti2_9, 2, Tuple [Ti1_8; Ti2_9])),
LetTuple ([a_6; b_7], x_5, Add (a_6, b_7))), ...)
Let (Ti10_17, 1, (* assoc assoc_tuple_p *)
Let (Ti11_18, 2,
Let (x_14,
Tuple [Ti10_17; Ti11_18],
LetTuple ([a_15; b_16], x_14,
Let (Ti12_13, Add (a_15, b_16), ...)))))
For a definition of smaller functions:
\[\begin {align} &{\cal I}_\varepsilon(\text {let rec } x\ y_1 \ldots y_n = e_1 \text { in } e_2) = \\ & \text {let rec } x\ y_1 \ldots y_n = {\cal I}_{\color {red}{\varepsilon'}}(e_1) \text { in } {\cal I}_{\color {red}{\varepsilon'}}(e_2) \\ & \text {where } \varepsilon' = \varepsilon, x \mapsto ((y_1, \ldots, y_n), e_1) \end {align}\]