DIP 1003 Formal Review

H. S. Teoh via Digitalmars-d digitalmars-d at puremagic.com
Tue May 16 13:00:29 PDT 2017


On Tue, May 16, 2017 at 09:48:07PM +0200, Timon Gehr via Digitalmars-d wrote:
[...]
> I'm saying no to this:
> 
> ...
> {
> 
> }{
> 
> }

It doesn't have to be formatted that way. For example:

	int foo()
	in { assert(blah); }
	{
		// not so bad after all
	}


[...]
> > 	int foo(T, U)(T t, U u)
> > 	if (sigConstraints!T && sigConstraints!U)
> > 	in (t > 0 && u < 10)
> > 	out(foo > 1 && foo < 5 )
> > 	{
> > 		// function body here
> > 	}
> > 
> > This is just tentative example syntax, of course.  We can argue over
> > its fine points later, but the point is that the current syntax is
> > far too verbose, and can easily be reduced to half the number of
> > lines.  Merely changing `body` to `do` does nothing to address this,
> > and seems to me to be just more useless churn, replacing one bit of
> > verbosity with another bit of verbosity.
> 
> It's a good option to have, but D is not an expression-based language,
> so this can be painful, as you cannot declare intermediate variables
> nor use statements.

Yes, I'm aware that one of the reasons for the current syntax was the
desire to allow arbitrary code inside contracts.  In practice, though, I
hardly ever encounter a use case that needed this, and even where it was
needed, the code was much better off being in a separate function so
that you could write, for example:

	bool elementsWithinRange(T)(T[] data, T lower, T upper) {
		foreach (e; data) {
			if (e < lower || e >= upper) return false;
		}
		return true;
	}

	int foo(T)(T[] data)
	in { assert(data.elementsWithinRange(0, 10); }
	body // ugh
	{
		...
	}

In the hypothetical new syntax, you could get rid of the assert
altogether for a much more concise expression of the in-contract.

IMO, if your contracts have become complex enough to require variables
and statements, then it's time to refactor them into properly-named
functions so that the person reading the code doesn't have to mentally
parse and execute the contract just to understand what requirements it's
trying to express.  D not being an expression-based language is not a
problem since contracts can call arbitrary functions. (In fact, I'd
argue it's an advantage, since it would require users to refactor their
contracts once it starts getting out-of-hand. The result should be
better readability.)


> > (Not to mention the IMO very ugly syntax clash with
> > do-loops, which will reduce code readability even more.)
> > ...
> 
> Do you think your new syntax is significantly more readable? (Just
> curious.)

It at least gets rid of the verbosity of the current syntax.  I don't
claim it's necessarily *significantly* more readable, but I'd consider
it to be one step closer.  Getting all the way there would be another
topic, and a very long, protracted one, given our track record.


T

-- 
"No, John.  I want formats that are actually useful, rather than over-featured megaliths that address all questions by piling on ridiculous internal links in forms which are hideously over-complex." -- Simon St. Laurent on xml-dev


More information about the Digitalmars-d mailing list