[wg-camlp4] Matching on concrete syntax (was: Re: Camlp4 uses)

Gabriel Scherer gabriel.scherer at gmail.com
Fri Mar 29 19:42:08 GMT 2013


Agreed: let's get a bit more experience with which syntax extensions can be
expressed with extension and attribute nodes before drawing more
conclusions on quasiquotations.


On Fri, Mar 29, 2013 at 8:18 PM, Alain Frisch <alain.frisch at lexifi.com>wrote:

> On 3/29/2013 4:12 PM, Gabriel Scherer wrote:
>
>> That is better indeed. I can only encourage you to add these kind of
>> conveniences in the E submodule (or maybe somewhere else) as usage
>> suggests that they are useful.
>>
>
> I believe that a good design for a Convenience submodule will follow the
> adaptation of existing syntax extension into -ppx style.  A first list of
> convenience functions can be found in:
>
> http://caml.inria.fr/cgi-bin/**viewvc.cgi/ocaml/branches/**
> extension_points/experimental/**frisch/print_gen.ml?revision=**
> HEAD&view=markup<http://caml.inria.fr/cgi-bin/viewvc.cgi/ocaml/branches/extension_points/experimental/frisch/print_gen.ml?revision=HEAD&view=markup>
>
> (a quick attempt to generate "variantizer" functions from type
> definitions, here taken from .cmi files)
>
>
>  I'm still not sure that quasi-quotations are not a better approach,
>> because the problem here is that the user has to learn a new interface
>> to describe code fragments instead of using the syntax he's already
>> familiar with.
>>
>
> I think it is very similar with quotations and antiquotations.  There are
> fewer names to know, but this can become more confusing.
>
> For instance, in:
>
>   <:expr<  $xxx:e$ >>
>
> you need different antiquotations names to indicate at least that x is (i)
> an expression, or (ii) a string to be interpreted as a lower-case
> identifier, or (iii) a longident, or (iv) a string to be interpreted as a
> constructor name, or (v) a string to be interpreted as a string literal.
>  Each anti-quotation can be used only in specific contexts. Basically, one
> recreates a dedicated sub-language, with its own syntax and types, whereas
> OCaml is not *that* bad at manipulating ASTs.
>
>
>
>  I still have the intuition that those arguments are more
>> relevant to the expert extension writer, and that for a large set of use
>> cases that concern *simple* extensions and beginner extension writers,
>> quasiquotations are still noticeably easier to use.
>>
>
> I wouldn't trust a syntactic tool written by someone who is not quite
> familiar with the definition of the Parsetree.  That said, I've nothing
> against trying to make writing extensions as simple as possible. I'm
> personally more interested in providing tools and techniques to support
> writing robust "non trivial" extensions, but it's a nice observation that
> the current proposal with extension nodes supports quotation, and I
> encourage people interested in supporting "concrete syntax" ppx rewriters
> to push this idea further.
>
>
>
>  The question of whether the extension uses classical or revised syntax
>> is largely orthogonal to the design of the extension itself (except
>> occasionally with quotation ambiguities concerns), and I could have used
>> the classic syntax to write the Camlp4 extension just as well.
>>
>
> Including within quotations?  At some time, this was not supported; later
> it was supported but discouraged, because the standard syntax was not
> "regular" enough to support non-ambiguous quotations (I don't know the
> details).  But maybe that the status of quotations in regular syntax has
> changed.
>
>
>  I found that
>> there was no such re-learning curve with quasiquotations, they just work
>> out of the box -- once you've been rebrained, once and forall, to see
>> those <:stuff< >> as structured code rather than ASCII noise.
>>
>
> Can you tell without looking at the documentation or existing code how to
> write a function which maps a string s to an AST fragment representing a
> constructor of name s applied to a single argument, the string literal
> represented by s.  I.e. mapping "Foo" to the AST fragment corresponding to
> the expression
>
>   Foo "Foo"
>
>
> ?
>
>      Implementing this "quote" expander is not very difficult, just a
>>     little bit tedious (and this can be automated by parsing the
>>     definition of the Parsetree).
>>
>>
>> Isn't that essentially the same thing as the tool you implemented for
>> Xavier above? (Can you reuse code between both?)
>>
>
> This tool relies on the toplevel value printer.  I'm not sure it will be
> easy to suport anti-quotations with this approach.
>
>
> > If I understand correctly, this is also the "Meta" operation of
> > Camlp4,
> > turning the AST for the expression <foo> into the AST for the OCaml
> > expression representing the AST for <foo>. When you say "automated by
> > parsing the definition of the Parsetree", do you have a realistic
> > design
> > in mind for such boilerplate code generators, or do you plan in
> > practice
> > to implement them by hand?
>
> Something similar to branches/extension_points/**experimental/frisch/
> print_gen.**ml <http://print_gen.ml> could be used to generate
> automatically an AST lifter.  The difficult part is to design
> anti-quotations, though, and since I'm not convinced by this approach, I'd
> rather put energy myself in other projects.
>
>
>  Same old battle-horse: I dislike the idea that [%quote ] would change
>> the meaning of syntactically valid OCaml code such as __patvar or
>> !!patvar.
>>
>
> Point taken.  But since we are already under an "extension", I think this
> is less bad.
>
>
>      Quasi-quotations would be useful if the expanders had to generate
>>     big fragments of mostly static code, with only a few "dynamic"
>>     placeholders.  In my experience, this is rarely the case: you
>>     assemble the resulting OCaml code by combining many small fragments
>>     generated programmatically.  For these cases, a nice library of "AST
>>     constructors" seems better to me.
>>
>>
>> Maybe we need both, but if we eventually get nice constructor names for
>> the AST definitions (I know that doesn't depend on you) I think if we
>> only had time/energy/maintenance for two among (1) AST definitions (2)
>> AST combinator library and (3) quasiquotation mechanism, I would suggest
>> we keep (1) and (3) rather than (1) and (2).
>>
>
> My preference, as you understood, would be (1) and (2) rather than (1) and
> (3).
>
> An interesting project would be to review existing syntax extension and
> see how much "almost static fragments" (where quasi-quotations shine) they
> have compared to code assembling tiny fragments (where combinators are
> betters).  I suspect that most interesting tools based on Camlp4 don't have
> a lot of static fragments, but I might be wrong.
>
>
> -- Alain
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ocaml.org/pipermail/wg-camlp4/attachments/20130329/547fc9f9/attachment.html>


More information about the wg-camlp4 mailing list