DIP 1009--Improve Contract Usability--Preliminary Review Round 1
MysticZach via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jun 21 22:46:06 PDT 2017
On Thursday, 22 June 2017 at 00:27:38 UTC, Timon Gehr wrote:
> On 21.06.2017 19:39, MysticZach wrote:
>> My counterargument to that is that it's possible that the
>> cognitive dissonance only occurs because of what people are
>> used to, rather than what is inherent to the syntax.
>
> This is a purely philosophical distinction without empirical
> basis.
Well I never experienced the dissonance myself, and was surprised
to find that others did experience it. I just thought my proposal
was a better syntax for `in` and `out` contracts.
>> Well my impression was that Walter liked it too, although I
>> could have misinterpreted his comment here:
>>
>> http://forum.dlang.org/post/ogvt66$1bcp$1@digitalmars.com
>
> He is saying it is good that a DIP to improve contract syntax
> /exists/. I agree with that.
It's really not clear what he meant. I guessed that the highest
probability of what he meant was that he actually liked the DIP,
as opposed to the mere fact that it _was_ a DIP. But as I already
said, I could have misinterpreted his comment. In the face of
lack of knowledge, it's a sign of wisdom to admit that one might
be wrong, I think.
>>>> If such an alternative checking system is utilized,
>>>
>>> there should be a way to hook into the checking logic.
>>>
>> Improving the checking logic interface may solve at a higher
>> level the problem I'm trying to solve at a very low one, with
>> mere syntax changes, and it might be (is probably?) the best
>> way forward.
>
> Your proposal does not solve this problem, and there is no need
> for this DIP to do that.
The goal of this DIP, and the problem I'm trying to solve, is
"Improve Contract Usability." And for this, H.S. Teoh's proposal
is a very good one. But it still has a sticking point, which I
want to resolve, namely that it elevates the existing `assert`
functionality beyond the current requirement that one must
explicitly write `assert`, going so far as to imply it in the
grammar itself. But because of many complaints about the
limitations of the assert mechanism as it currently exists, I
would hesitate to install it into the grammar as the "One Chosen
Way" to bail out of contracts with the new syntax.
However, if the functioning of the `assert` mechanism were more
customizable, then it would be easier to entrust it, in my
opinion, with the "sacred responsibility" of being installed into
the grammar. H.S. Teoh's proposal would then stand on a firmer
foundation, and my initial proposed syntax would become the
inferior optionl. At that point, this DIP could be rewritten to
advocate his syntax instead. (I think it would be better to just
retain the number and title "DIP1009: Improve Contract Usability"
than to make a new one for the same issue. Other DIPs have
followed this pattern, where it was the goal and title that
remained the same, while the specifics changed.)
> We are looking for a significant improvement. Otherwise, what's
> the point? We need to justify the cost.
The intent of my proposal was to make a small improvement. The
cost (or so I thought, and may still believe) was also small.
Small improvements are still improvements. DIP1003 is an example
of this.
https://github.com/dlang/DIPs/blob/master/DIPs/DIP1003.md
> The point of contracts is assigning blame by documenting
> assumptions and guarantees. If something within the function
> body crashes, it's ideally the fault of the function
> implementation.
> ...
> I like new as long as it is an improvement. This is not. Having
> syntax subtrees that do not actually logically belong to their
> parent in the grammar is awkward language design, especially if
> they affect the parent's signature.
I'm still wondering what, in practice, the difference really is.
With existing syntax:
int fun(int a)
in { assert(a); } // 1
do {
assert(a); // 2
...
}
What will the compiler or programmer actually learn from 1 if it
violates that they won't learn from 2 if it violates? What is the
practical incentive for `in` contracts at all? All my new syntax
does is assume that there is in fact a difference between 1 and
2, and makes 1 easier to write, as:
int fun(int a) {
in assert(a); // 1
assert(a); // 2
...
}
As far as syntax subtrees not belonging to their parent, I can
see where the cognitive dissonance comes from. But it just
doesn't seem that bad to me, since contracts are always executed
as if they are sequential statements anyway. I would imagine that
new programmers who only ever encountered the new proposed syntax
would be surprised that the old syntax ever existed in the first
place, as it's so unnecessarily awkward.
But at this point, we might as well wait for more feedback from
other people.
More information about the Digitalmars-d
mailing list