On Tuesday, 15 December 2015 at 01:10:01 UTC, Chris Wright wrote:
On Mon, 14 Dec 2015 18:45:28 -0500, Steven Schveighoffer wrote:
On 12/14/15 2:04 PM, bachmeier wrote:
It's unanimous, at least among the three of us posting in
this Reddit thread:
https://www.reddit.com/r/programming/comments/3wqt3p/
programming_in_d_ebook_is_at_major_retailers_and/cxyqxuz
Something has to be done with the documentation for Phobos
functions that involve ranges and templates. The example I
gave there is
bool isSameLength(Range1, Range2)(Range1 r1, Range2 r2) if
(isInputRange!Range1 && isInputRange!Range2 &&
!isInfinite!Range1 &&
!isInfinite!Range2);
This is by far, one of the least problematic examples.
A while back, I wanted to use std.algorithm.find to search for
something. I wasn't sure what order to call the parameters
with, so I looked at the documentation. After about 10-15
minutes of trying to deduce whatever template overload was
going to match, if any at all, I just decided to write the
call and see if it worked (it did).
The documentation for IFTI functions like this needs to be
simplified greatly. Essentially, I need to know what types of
things I can use, and what order I need to pass them. But I
don't need all the details of which overload will be called
depending on some obscure template constraint.
I don't know if there's an automated way to do this. IFTI
functions are so powerfully useful, that it's almost
impossible to have this done automatically.
In the example of find, a possible way to do this is to wrap
the whole set of overloads into one simplified call:
Range1 find(Range1 haystack, N needle)
And then explain what Range1 and N can be. Then allow one to
expand the docs to see all the true signatures if I want to.
This reminds me of the Tango strategy for this kind of thing.
tango.core.Array was arranged like this:
version(TangoDoc) {
/** Documentation comment. */
bool isSameLangth(Range1, Range2)(Range1 r1, Range2 r2) {
return true;
}
} else {
bool isSameLength(Range1, Range2)(Range1 r1, Range2 r2)
if (
isInputRange!Range1 &&
isInputRange!Range2 &&
!isInfinite!Range1 &&
!isInfinite!Range2) {
// actual implementation
}
}
Of course, this was before template constraints -- which in
turn means that the templates they were doing this for were
much more succinct than what you find in std.algorithm, and
they still felt it important to simplify for the sake of
documentation.
It's not ideal because it relies on prose documentation, which
might be far from the implementation, to stay up to date. On
the other hand, it's something that can be done today, without
any changes to ddoc.
An outer template that forwards to specialized templates would
be cleaner.
Hiding conditionals does not seem like to be solution. Here is my
idea:
Show the function:
bool isSameLength(Range1, Range2)(Range1 r1, Range2 r2)
Then show the conditions separately:
if(
isInputRange!Range1 &&
isInputRange!Range2 &&
!isInfinite!Range1 &&
!isInfinite!Range2
)
I am not sure whether ddoc supports/can support this, but being
able to do this, and
even adding separate comment on function and its conditionals
separately could be quite useful. I know just talking doesn't
make anything working, but idea is needed first.
By the way, I wish "and", "or", "xor" were in the language as in
Pascal. Things could be more human friendly maybe.