Implement continuation expansion with the OCaml AST mapper
This commit is contained in:
1 file changed
+21
@@ -0,0 +1,21 @@
|
||||
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 })
|
||||
Reference in new issue
Block a user