Implicit braces in ocamltest trees#13259
Conversation
The new tree syntax for ocamltest greatly improves the common case where several
test cases are sequentially composed, each depending on the last. We can now
write such tests as
```
test1;
test2;
test3;
test4;
...
test27;
```
without increasing the indentation level. This makes sense because these tests
are not “nested” in any meaningful sense, any more than consecutive statements
in imperative code are nested. Practically speaking, the great advantage is that
we can now add `test1a` between `test1` and `test2` without increasing
indentation (or other markers of nested-ness).
Unfortunately, this only works if `test1a` belongs in the sequence with the
other tests. But it might be completely independent: for example, it might check
an error case that is only meaningful after `test1` but has no bearing on the
other tests. In that case, we have three unpalatable options:
1. Write it in the sequence anyway. This obscures the structure of the test
cases and causes the entire rest of the sequence to be skipped if `test1a`
fails.
2. Indent _every test in the sequence after `test1a`_ and risk emotional damage
the next time you try to rebase.
3. Add braces around every test in the sequence after `test1a` but don't indent,
then try to invent a convention that will help you keep the formatting
straight.
The annoying thing here is that `test4` is _still_ not meaningfully “more nested”
than `test1`. It just happens that there's an extra branch jutting out of the
sequence somewhere between `test1` and `test4`, and the syntax makes that
everyone's problem.
My proposed syntax is this:
```
test1;
{
test1a;
}
test2;
test3;
test4;
...
test27;
```
This is exactly as if we'd put braces around everything from `test2` to
`test27`, but it once again expresses that this is simply a sequence of tests in
a chain. It's just that now there are some tests that branch off from the
sequence.
|
Technical remarks:
Design remark: we scratched our head to understand what would be a good semantics for I think that deep down your complaint is that the parallel construct has a nesting syntax that encourages indentation (otherwise the closing delimiter is dangling weirdly). Could the problem be solved by adding an infix form to introduce parallelism? For example, I wonder if we could define reasonable precedence rules for is an unambiguous way to write what you have in mind. (Note: there is a weird relation to the use of |
It was indeed ambiguous (this was ported from flambda-backend, which apparently isn't running Menhir with
Sure, pushed a commit renaming
That's about right, yeah. In particular, you do want to indent sometimes, but maintaining a file in which there are both indenting and non-indenting braces sounds pretty miserable.
This could work. One awkward thing is that I do still want If we use the PR as is, we could later express “do this after all the branches” as Then |
|
I agree that my proposal with On the other hand, I find that your proposal has counter-intuitive semantics: if we show the test script to people who haven't read the ocamltest documentation (nobody does), are they going to guess the real semantics? (And how would they realize that their assumption is wrong?) |
|
Hmm. Maybe we could flip it around a bit and add a keyword that embeds a tree into a statement list? Maybe (I was going to suggest |
|
So for example would be equivalent to This makes sense to me : it reads better than my proposal, and there is less potential for confusion than with your initial proposal. Before you do the work of adapting the implementation, I think that it would be nice to have the opinion of other people who formulated opinions on ocamltest syntax in the past, for example @shindere, @damiendoligez or @Octachron. Note: we do have the property that |
|
My impression is that other people are not planning to give a different opinion on this topic, so I propose to assume that my dislike of your current syntax forms a (singleton) consensus. Should we close the current PR and let you propose a different syntax when available? (Of course closing is not a final decision, people can always discuss further to revisit.) |
|
I agree that the singleton syntax feels too ambiguous. The |
I had a look through the existing tests and I don't see any that are obviously in a state to rewrite this way right this second. It would make it easier to add to existing tests going forward, though. For example, |
The new tree syntax for ocamltest greatly improves the common case where several test cases are sequentially composed, each depending on the last. We can now write such tests as
without increasing the indentation level. This makes sense because these tests are not “nested” in any meaningful sense, any more than consecutive statements in imperative code are nested. Practically speaking, the great advantage is that we can now add
test1abetweentest1andtest2without increasing indentation (or other markers of nested-ness).Unfortunately, this only works if
test1abelongs in the sequence with the other tests. But it might be completely independent: for example, it might check an error case that is only meaningful aftertest1but has no bearing on the other tests. In that case, we have three unpalatable options:test1afails.test1aand risk emotional damage the next time you try to rebase.test1abut don't indent, then try to invent a convention that will help you keep the formatting straight.The annoying thing here is that
test4is still not meaningfully “more nested” thantest1. It just happens that there's an extra branch jutting out of the sequence somewhere betweentest1andtest4, and the syntax makes that everyone's problem.My proposed syntax is this:
This is exactly as if we'd put braces around everything from
test2totest27, but it once again expresses that this is simply a sequence of tests in a chain. It's just that now there are some tests that branch off from the sequence.