Files
continuum_ppx/continuum_ppx.ml

22 lines
926 B
OCaml

open Asttypes
open Parsetree
let expression mapper node =
let node = Ast_mapper.default_mapper.expr mapper node in
match node.pexp_desc with
| Pexp_extension ({ txt = ("continue" | "cps"); loc }, payload) ->
begin match payload with
| PStr [{ pstr_desc = Pstr_eval
({ pexp_desc = Pexp_let (Nonrecursive, [binding], body); _ }, _); _ }] ->
let callback = Ast_helper.Exp.fun_ ~loc:binding.pvb_loc
~attrs:binding.pvb_attributes Nolabel None binding.pvb_pat body in
Ast_helper.Exp.apply ~loc:node.pexp_loc ~attrs:node.pexp_attributes
binding.pvb_expr [Nolabel, callback]
| _ -> Location.raise_errorf ~loc
"continuum_ppx: expected let%%continue pattern = expression in body (one nonrecursive binding)"
end
| _ -> node
let () = Ast_mapper.register "continuum_ppx"
(fun _ -> { Ast_mapper.default_mapper with expr = expression })