OCaml migrate parse tree
Earlier this year, this blog post [2] explored the implementation of a small preprocessor extension (ppx).
The code of the above article worked well enough at the time but as written, exhibits a problem : new releases of the OCaml compiler are generally accompanied by evolutions of the OCaml parse tree. The effect of this is, a ppx written against a specific version of the compiler will "break" in the presence of later releases of the compiler. As pointed out in [3], the use of ppx's in the OCaml eco-system these days is ubiquitous. If each new release of the OCaml compiler required sychronized updates of each and every ppx in opam, getting new releases of the compiler out would soon become a near impossibilty.
Mitigation of the above problem is provided by
the ocaml-migrate-parsetree
library. The library provides the means to convert parsetrees
from one OCaml version to another. This allows the ppx rewriter to
write against a specific version of the parsetree and lets the
library take care of rolling parsetrees backwards and forwards in
versions as necessary. In this way, the resulting ppx is "forward
compatible" with newer OCaml versions without requiring ppx code
updates.
To get the ppx_id_of
code from the earlier blog post
usable with ocaml-migrate-parsetree
required a couple
of small tweaks to make it OCaml 4.02.0 compatible. The changes from
the original code were slight and not of significant enough interest
to be worth presenting here. What is worth looking at is what it
then took to switch the code to
use ocaml-migrate-parsetree
. The answer is : very
little!
open Migrate_parsetree
open OCaml_402.Ast
open Ast_mapper
open Ast_helper
open Asttypes
open Parsetree
open Longident
(* The original ppx as written before goes here!
. . .
. . .
. . .
*)
let () = Driver.register ~name:"id_of" (module OCaml_402) id_of_mapper
The complete code for this article is available
online here
and as a bonus, includes a
minimal jbuilder
build system demonstrating just how well the OCaml tool-chain comes
together these days.
References:
[1] "A
Guide to Extension Points in OCaml" -- Whitequark (blog post
2014)
[2] "Preprocessor
extensions for code generation" -- Shayne Fletcher (blog post
2017)
[3] "Extension
Points - 3 Years Later" -- Rudi Grinberg (blog post 2017)