DIP 1003 Formal Review
H. S. Teoh via Digitalmars-d
digitalmars-d at puremagic.com
Wed May 17 10:16:01 PDT 2017
On Wed, May 17, 2017 at 05:06:40PM +0000, MysticZach via Digitalmars-d wrote:
[...]
> 3. If `body` were optional, probably a lot of people wouldn't be using
> it to begin with. I suspect that Jonathan and I are not alone in
> thinking that it's not just useless, it's annoying. Thus, only code
> that uses it would have this problem.
FWIW, I also find it annoying. Very annoying, in fact. The underlying
gripe I have with it (apart from verbosity) is the asymmetry caused by
the appearance of an extra(neous) keyword `body` in front of what is
otherwise an undecorated {...} function body block, just because
optional elements (in/out) were introduced.
In other words, what irks me is that when there are no contracts, you
have this:
auto func(...) { /* code */ }
But when there are contracts, not only do the contracts themselves
appear (in {...} and/or out(...){...}), but an extraneous keyword `body`
also appears. To put this in context, consider all the variations
together:
auto func(...) { /* code */ }
auto func(...) in{...} body { /* code */ }
auto func(...) out(...){...} body { /* code */ }
auto func(...) in{...} out(...){...} body { /* code */ }
Notice how the appearance of `body` in the 2nd to 4th lines sticks out
like a sore thumb.
Since in{...} and out(...){...} are optional elements, it would be more
aesthetically pleasing if they did not also affect the syntax around
them, e.g.:
// Now they are truly optional, and the surrounding syntax
// doesn't change by their presence/absence.
auto func(...) { /* code */ }
auto func(...) in{...} { /* code */ }
auto func(...) out(...){...} { /* code */ }
auto func(...) in{...} out(...){...} { /* code */ }
Alternatively, the asymmetry would be eliminated if `body` was a
*required* keyword before the function body, e.g.:
auto func(...) body { /* code */ }
auto func(...) in{...} body { /* code */ }
auto func(...) out(...){...} body { /* code */ }
auto func(...) in{...} out(...){...} body { /* code */ }
But I doubt anyone here would agree to making `body` a required keyword
when there are no contracts!
T
--
Unix is my IDE. -- Justin Whear
More information about the Digitalmars-d
mailing list