@@ -41,13 +41,35 @@ let alpha_conversion (meta : Lam_stats.meta) (lam : Lambda.lambda) : Lambda.lamb
41
41
List. map simpl ll, {info with apply_status = Full } )
42
42
else if x > len
43
43
then
44
- let extra_args = Ext_list. init (x - len) (fun _ -> (Ident. create " param" )) in
45
- Lfunction (Curried , extra_args,
46
- Lapply (simpl l1,
47
- List. map simpl ll @
48
- List. map (fun x -> Lambda. Lvar x) extra_args ,
49
- {info with apply_status = Full }
50
- ))
44
+ (* Lapply(simpl l1, List.map simpl ll, info ) *)
45
+ let extra_args = Ext_list. init (x - len)
46
+ (fun _ -> (Ident. create " param" )) in
47
+ let fn = simpl l1 in
48
+ let args = List. map simpl ll in
49
+ let extra_lambdas = List. map (fun x -> Lambda. Lvar x) extra_args in
50
+ let args, bindings =
51
+ List. fold_right (fun lam (acc , bind ) ->
52
+ match lam with
53
+ | Lambda. Lvar _
54
+ | Lconst (Const_base _ | Const_pointer _ | Const_immstring _ )
55
+ | Lprim (Lambda. Pfield (_), [Lprim (Lambda. Pgetglobal _, _)] )
56
+ | Lfunction _
57
+ ->
58
+ (lam :: acc, bind)
59
+ | _ ->
60
+ let v = Ident. create Literals. partial_arg in
61
+ (Lambda. Lvar v :: acc), ((v, lam) :: bind)
62
+ ) args ([] ,[] ) in
63
+ (* let args, bindings = args, [] in *)
64
+ let rest : Lambda.lambda =
65
+ Lfunction (Curried , extra_args,
66
+ Lapply (fn,
67
+ args @ extra_lambdas ,
68
+ {info with apply_status = Full }
69
+ )) in
70
+ List. fold_left (fun lam (id ,x ) ->
71
+ Lambda. Llet (Strict , id, x,lam)
72
+ ) rest bindings
51
73
(*
52
74
let f x y = x + y
53
75
Invariant: there is no currying
0 commit comments