[ANN] First release of metapp

I am happy to announce the first release of metapp, yet another preprocessor for OCaml. Similarly to ppx_optcomp, metapp is a PPX rewriter. But instead of introducing a specific DSL for preprocessor directives, metapp provides a [%meta ...] extension, where the dots ... are arbitrary OCaml expressions that are substituted at compile-time by the AST nodes they evaluate into. These expressions build AST nodes either by (anti-)quoting some code directly, or by using compiler-libs (Parsetree, Ast_helper, …).

In particular, this preprocessor is easy to use for conditional compilation, and is an alternative to cppo and ppx_optcomp.

let option_get o =
  [%meta if Sys.ocaml_version >= "4.08.0" then
     [%e Option.get o]
  else
     [%e match o with
     | None -> invalid_arg "option_get"
     | Some x -> x]]

In this example, the code between [%e ... ] is “anti-quoted”: it is the code that is inserted (conditionally) in the rewritten module. Of course, the anti-quoted code can contain itself some [%meta ...] code. [%meta ...] can even itself contain other levels of [%meta ...] code for multi-stage programming.

An example of usage of metapp is the metaquot package, which implements the same quoters as ppx_tools.metaquot: [%expr ...], [%type: ...], etc. These quoters are implemented by meta-programming: the meta-code introspects Parsetree.cmi from compiler-libs to generate the code matching the current OCaml version.

9 Likes

To potentially save a few second to the next readers: https://github.com/thierry-martinez/metapp seems to be the repo where it is hosted.

2 Likes

Thanks, @raphael-proust! The package is also available via opam: opam install metapp (and metaquot is available via opam as well).