ocaml/camlp4/examples/syb_map.ml

52 lines
1.1 KiB
OCaml

type variable = string
and term =
| Var of variable
| Lam of variable * term
| App of term * term
| Const of constant
and constant =
| CInt of int
| CString of string
and program =
| Def of string * term
| Seq of program list
;;
class map = Camlp4Filters.GenerateMap.generated;;
(* class map = Camlp4MapGenerator.generated;; *)
let map_term f = object
inherit map as super
method term t = f (super#term t)
end;;
let map_term' f = object (self)
inherit map as super
method term t = f t self#term super#term
end;;
(* Suppress calls to the identity function... *)
let suppress_id =
map_term begin function
| App(Lam(v, Var(v')), t) when v = v' -> t
| x -> x
end;;
(* Substitute blindly all occurences of v by t *)
let raw_subst v t =
map_term' begin fun t' _ next ->
match t' with
| Var(v') when v = v' -> t
| x -> next x
end;;
let id = Lam("x", Var"x");;
let _42 = Const(CInt 42);;
let prog =
Seq[Def("foo", App(id, _42)); Def("bar", App(id, id))];;
let prog2 = suppress_id#program prog;;
let term3 = suppress_id#term (App(id, _42));;
let term4 = (raw_subst "x" _42)#term (App(Var"succ", Var"x"));;