[wg-camlp4] Request for feedback
Alain Frisch
alain.frisch at lexifi.com
Thu Mar 7 16:55:14 GMT 2013
On 03/07/2013 05:23 PM, Gabriel Scherer wrote:
> I'm wondering how much I should trust them :p Have you actually tried
> to parse the most daring ones with your parser? If you have a
> testsuite, it may be interesting to add them to it.
Yes, I've tried most of them. Most of them work. A few number are
rejected, but only because more work is needed on the parser (e.g.
for[@id] is not yet supported, even though it would have taken less time
to add support than to write this sentence; and class expressions do not
yet support extension nodes).
> While I admire the cleverness of using the fact that attributes are
> OCaml syntax to get the "quotation" use cases for free, it also gives
> me mixed feelings:
> - I'm not sure how robust it is to future design changes
It is true that there could be some discontinuity: at some point, you
can shoehorn your "DSL" in the syntax of OCaml expressions, but when you
extend it, you might not find a nice way to continue doing so and you
might be forced to switch to a very different embedding. I don't
believe that this will be a serious problem in practice, in particular
because one can always use an extension node with a string literal
content in order to use custom concrete syntax locally in most
syntactic categories (or directly a string if the category accept it,
i.e. expressions and patterns). As an example, let's have a look at the
bitstring example:
let bits = Bitstring.bitstring_of_file "/bin/ls" in
[%bit match bits with
| [ 0x7f, 8; "ELF", 24, string; (* ELF magic number *)
e_ident, Mul(12,8), bitstring; (* ELF identifier *)
e_type, 16, littleendian; (* object file type *)
e_machine, 16, littleendian (* architecture *)
] ->
printf "This is an ELF binary, type %d, arch %d\n"
e_type e_machine
]
One can imagine that in an early version, the size field could only be
specified as an int literal. When the author decides to let his users
write "12*8", he can decide between:
- Creating some "DSL" to describe those formulas, with a syntax
compatible with patterns, as I did in the example above (Mul(12, 8))
e_ident, Mul(12,8), bitstring; (* ELF identifier *)
- Using a string to represent the formula (but then one must create a
new parser... or call the OCaml parser!):
e_ident, "12 * 8", bitstring;
- Using an extension node to allow injecting an expression without
requiring a parser:
e_ident, [%sz 12 * 8], bitstring;
(Here we don't care about the "id" of the extension node. It is
worth creating a syntax for name-less extension nodes?)
> - For multi-line quotations, I would appreciate a slightly more
> explicit syntax (possibly the symmetric delimiter to help users see
> where the quotation end).
Do you mean:
[%bit ... %bit]
or:
[%bit ... bit%]
or:
[%bit ... %]
or something else?
Note than one can also write:
begin[@bit]
....
end
The only difference is that if we compile without the "bitstring
expander", we will probably get a type-error which might be a little
harder to understand. I was thinking about supporting:
begin[%bit]
....
end
as an equivalent to:
[%bit ....]
but this would be ambiguous (function appliction with [%bit] in function
position).
Alain
More information about the wg-camlp4
mailing list