[wg-camlp4] Against the use of syntactically-valid OCaml code for syntax extension purposes

Alain Frisch alain at frisch.fr
Wed Jan 30 06:17:30 GMT 2013


On 1/29/2013 7:53 PM, Gabriel Scherer wrote:
> I'm not sure the idea of having "postfix" and "prefix" annotations
> makes sense for all grammar rules (and mixing them with a modality of
> "external or ocaml-syntax" feels like conflating separate concerns).

I agree.  If we have a syntax for embedding arbitrary syntax (basically, 
a new kind of string literals in expressions and patterns, with 
adifferent lexing rules, and rejected by the type-checker), let's say {{ 
... }}, we could use it either as a stand-alone expression

  {{ ... }}

or as an attribute on another expression:

  (@{{ ... }}) e

So I don't think we need to provide parsed and non-parsed variants of 
attributes.

What makes sense is maybe to distinguish attributes which can be dropped 
silently by the compiler (but used by other tools like ocamldoc, for 
instance) and those on which the type-checker needs to fail.  This is 
not strictly necessary if we already have a new kind of expressions on 
which the type-checkers fail, and it does not really bring much security 
because the user could easily use the other syntax of attributes and get 
(probably) simply a type error instead of a "remaining attribute" error.


> I'd rather consider where annotation may happen for grammar rules
> individually. For example, in the case of "let p = e1 in e2", I'm
> quite sure we may want to annotate either the whole expression or
> specifically the declaration, and while I see how prefix and postfix
> both make sense for the whole expression, I'm not sure they would both
> make sense to annotate the binding, and considering only those cases
> could lead them to being dropped.


>
> Still in this case 'let p = e1 in e2', how should we distinguish:
> - an annotation on the expressions 'e1' and 'e2'
> - an annotation on the pattern 'p' (possibly seen as an expressions)
> - an annotation on the binding itself
> - an annotation on the expression as a whole?

We need of course to define priority rules, but I don't see why postfix 
and prefix couldn't make sense for all constructions (maybe with some 
more parentheses):

On the whole expression:
  (@ ..) (let p = e1 in e2)
  (let p = e1 in e2) (% ..)

On the pattern:
  let (@ ..) p = e1 in e2
  let p (% ..) = e1 in e2

On e1:
  let p = (@ ..) e1 in e2
  let p = e1 (% ..) in e2

On e2:
  let p = e1 in (@ ..) e2
  let p = e1 in e2 (% ..)

What's missing is maybe the ability to annotate either the binding 
itself as opposed to the whole expression (more interesting when the 
whole expression has multiple bindings: let p1 = e1 and p2 = e2 and 
...).  But is that really necessary?  One can always use the convention 
that an annotation on the binding would actually need to be put at the 
toplevel of the pattern itself.



Alain


More information about the wg-camlp4 mailing list