[wg-camlp4] A new branch to experiment with extension points

Xavier Clerc xavier.clerc at inria.fr
Wed Mar 6 16:03:00 GMT 2013



----- Mail original -----
> On 03/06/2013 04:17 PM, Xavier Clerc wrote:
> > I will not discuss the syntax per se, but I wonder whether
> > having both prefix and suffix attributes is not error-prone.
> > Could you elaborate on the need of having both?
> 
> I proposed to use a prefix attribute (on an include statement) to
> create
> ocamldoc sections:
> 
> [^^doc section "Section Title"] include
>     ...
> end
> 
> but I now tend to prefer "floating" attributes in signatures.
> 
> Gabriel gave another example to justify the need for a prefix syntax:
> 
>   begin [: pragma(non_exhaustive_match) :]
>      ...
>   end
> 
> but this might be subsumed by the special form:
> 
>     begin[@id expr] ... end
> 
> which is equivalent to:
> 
>    (...)[@id expr]
> 
> 
> Do people see use cases where the prefix syntax is much better?
> 
> > Another, unrelated question: as an extension developer, it
> > seems that I will have to deal with full-fledged expressions
> > as attributes values. Do you plan some mechanism to allow
> > easy access to an identifier used in such an expression.
> > I mean, it can even refer to another module. This also implies
> > that you could create dependencies between modules solely
> > through attributes; is that correct?
> 
> Expressions used inside attributes/extension nodes are just
> syntactical
> expressions.  They are never type-checked and their identifiers are
> not
> resolved; ocamldep does not look inside those expressions.
> 
> We could use any "universal" type instead of expressions (strings,
> s-expressions, xml, json).  Some arguments to use OCaml expressions:
> 
>   - This is a rich language, in which we can encode various DSL
> understood by extensions, so that the extensions don't need to do any
> parsing.
> 
>   - We already have a parser!
> 
>   - The syntax will look familiar to OCaml developers and adapting
> editors to nicely support (colors, indentation, etc) them will be
> easy.
> 
>   - It won't be uncommon to embed fragments of OCaml code, to be
> inserted into the real code fed to the compiler, within those
> expressions. Example:
> 
>    type t = {
>       x: int;
>       y [@default (x + 1)]: int;
>       z [@optional]: int option;
>    } [@@builder {with_labels; invariant=(x <= y)}]
> 
>   rewritten to:
> 
>    type t = {
>       x: int;
>       y: int;
>    }
> 
>    let build_t ~x ?(y = x + 1) ?z () =
>       assert(x <= y);
>       {x; y; z}
> 
> 
> 
> As an extension developer, you don't need to suffer from the
> complexity
> of OCaml expression.  Instead,  you are free to define the subset of
> OCaml expressions which make sense inside "your" attributes/extension
> nodes, and fail when the user doesn't comply with this constraint.

Thanks for the clarification. However, I am now afraid about user side...
Expression will be treated in a non-uniform way by attributes.
Moreover, replacing a literal constant with a symbolic one will cause
extension to stop working. Honestly, I cannot say if it is a big deal.
But, I think it can be a surprise.


Xavier Clerc



More information about the wg-camlp4 mailing list