[wg-camlp4] Time for a summary?
Alain Frisch
alain.frisch at lexifi.com
Thu Feb 7 16:52:49 GMT 2013
On 2/7/2013 2:16 PM, Gerd Stolpmann wrote:
> Currently, there is no documentation about parsetrees, and I would need
> to guess how they are built up. But if there was some documentation plus
> some examples it would probably be fully acceptable.
See the discussion with X. Clerc on this list. It has been suggested to
add a compiler option to dump the parse tree into "Parsetree" syntax
(Pexp_... constructors).
> "let rec" might be a bad example, because such a change is not expected,
> but generally we _will_ run into the problem that changes of the
> parsetree type break ppx processors. (Well, to some degree we can avoid
> this by having wrapper functions, i.e. don't use E.let_ directly, but a
> function mk_let, as then many changes can be done in a way that doesn't
> affect compatibility.)
E.let_ is already a wrapper around the constructor:
let mk ?(loc = Location.none) x = {pexp_desc = x; pexp_loc = loc}
...
let let_ ?loc a b c = mk ?loc (Pexp_let (a, b, c))
If the Parsetree is extended, there are different ways to organize
ourselves to avoid breaking existing -ppx rewriters (at least for AST
fragments "builders", not "patterns"): new functions, optional
arguments, a copy of the ast_mapper module to support older versions of
the Parsetree (with an implicit mapping). But it also make sense to
think about ways to make the definition of Parsetree itself more robust
to future changes. For instance, using records instead of tuples is
much more future-proof: when deconstructing a node, one can choose to
use "open record patterns" (to explicitly ignore future fields which
could be added) or not (to be forced to adapt the code if more fields
are added); and wrapper functions can use optional arguments for new
fields.
Alain
More information about the wg-camlp4
mailing list