36 lines
1 KiB
OCaml
36 lines
1 KiB
OCaml
open Ppxlib
|
|
|
|
module B = Ast_builder.Make (struct
|
|
let loc = Location.none
|
|
end)
|
|
|
|
let add_function =
|
|
let param v = B.pparam_val Nolabel None (B.ppat_var (B.Located.mk v)) in
|
|
let body =
|
|
B.pexp_function
|
|
[ param "b" ]
|
|
None
|
|
(Pfunction_body
|
|
(B.pexp_apply
|
|
(B.pexp_ident (B.Located.mk (Lident "+")))
|
|
[
|
|
(Nolabel, B.pexp_ident (B.Located.lident "a"));
|
|
(Nolabel, B.pexp_ident (B.Located.lident "b"));
|
|
]))
|
|
in
|
|
let func = B.pexp_function [ param "a" ] None (Pfunction_body body) in
|
|
B.pstr_value Nonrecursive
|
|
[ B.value_binding ~pat:(B.ppat_var (B.Located.mk "f")) ~expr:func ]
|
|
|
|
let generative_functor =
|
|
let empty_struct = B.pmod_structure [] in
|
|
B.pstr_module
|
|
(B.module_binding ~name:(B.Located.mk (Some "F"))
|
|
~expr:(B.pmod_apply (B.pmod_ident (B.Located.lident "F")) empty_struct))
|
|
|
|
let () =
|
|
Driver.register_transformation
|
|
~impl:(fun impl -> add_function :: generative_functor :: impl)
|
|
"migrators"
|
|
|
|
let () = Driver.standalone ()
|