[wg-camlp4] A new branch to experiment with extension points
Alain Frisch
alain.frisch at lexifi.com
Wed Mar 6 15:51:17 GMT 2013
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.
More information about the wg-camlp4
mailing list