Thanks for the point ! Xavier Van de Woestyne http://xvw.github.io ![](https://link.nylas.com/open/5y0wh7okaezysfzysovho20yh/local-37964069-61f2?r=Y2FtbC1saXN0QGlucmlhLmZy) On juin 20 2016, at 5:32 pm, Marc Lasson <marc.lasson@lexifi.com> wrote: > To paraphrase the code, I just advised Xavier to use a mapper that does > recursively not call itself. > > > (* Mapper for all transformation *) > > let general_mapper = Ast_mapper.{ default_mapper with structure = > > structure } > > > > (* New Mapper only for the toplevel *) > > let toplevel_mapper = > > Ast_mapper.{ > > default_mapper with > > structure = fun _ str -> > > let pl = Ast_helper.Str.eval (Ppx.Fabric.print_endline "Hello > > World") in > > pl :: (general_mapper.structure general_mapper str) > > } > > ``` > > Note that if you do not plan to extend general_mapper with a mapper that > actually does something you could simply write : > > let toplevel_mapper = > Ast_mapper.{ > default_mapper with > structure = fun _ str -> > let pl = Ast_helper.Str.eval (Ppx.Fabric.print_endline "Hello > World") in > pl :: str > } > > Also, if the ppx is also applied to compile mli interfaces, then this > will be structures occurring within the toplevel signature (eg. in the > payloads of attributes). So to be "safe", you should probably do : > > let toplevel_mapper = > Ast_mapper.{ > default_mapper with > signature = fun _ -> default_mapper.signature default_mapper; > structure = fun _ str -> > let pl = Ast_helper.Str.eval (Ppx.Fabric.print_endline "Hello > World") in > pl :: str > } > > \-- > Marc. > > \-- > Caml-list mailing list. Subscription management and archives: > https://sympa.inria.fr/sympa/arc/caml-list > Beginner's list: [http://groups.yahoo.com/group/ocaml_beginners](http://groups.yahoo.com/group/ocaml_beginners&r=Y2FtbC1saXN0QGlucmlhLmZy) > Bug reports: [http://caml.inria.fr/bin/caml-bugs](http://caml.inria.fr/bin /caml-bugs&r=Y2FtbC1saXN0QGlucmlhLmZy)