On Thursday, 5 February 2015 at 00:24:15 UTC, Andrei Alexandrescu
wrote:
I'm seeing another idiom that seems to become fashionable.
Consider this excerpt from
https://github.com/D-Programming-Language/phobos/blob/master/std/algorithm/iteration.d#L407:
auto opSlice(size_t low, size_t high)
in
{
assert(low <= high);
}
body
{
import std.range : take;
return this[low .. $].take(high - low);
}
which of course trivially boils down to:
auto opSlice(size_t low, size_t high)
{
assert(low <= high);
import std.range : take;
return this[low .. $].take(high - low);
}
What advantage could possibly be in transforming a 5-liner into
a 9-liner? Are we really aiming at writing the maximum possible
lines of code here and using as many language features as
possible everywhere?
I think we should dust off that Phobos contributors' guide.
Sadly, there is little we can do against the more subtle issues.
Andrei
[caveat: I've read some of the posts, yet I don't know, if this
has been proposed before in any form]
What about moving the contracts somewhere else, like the
unittests?
auto opSlice(size_t low, size_t high)
{
import std.range : take;
return this[low .. $].take(high - low);
}
contract {
opSlice(size_t low, size_t high) {
assert(low <= high);
};
sayHello(string str) {
assert(str.length);
}
// ...
}
Maybe contract functions could be labelled.
@contract auto opSlice(...) ...
Destroy.