Hi,
On 19 December 2022 17:10:18 GMT, Edward Catmur <ecatmur@googlemail.com> wrote:
>On Mon, 19 Dec 2022 at 17:56, Lénárd Szolnoki via Std-Discussion <
>std-discussion@lists.isocpp.org> wrote:
>
>> My reading in pseudocode it would look something like:
>>
>> /* ...comparing corresponding elements xi and yi in the expanded lists of
>> subobjects for x and y (in increasing index order) until the first index i
>> where xi == yi yields a result value which, when contextually converted to
>> bool, yields false. */
>> bool mismatch_found = false;
>> for (size_t idx=0; idx < member_count; ++idx) {
>> if (not (lhs_members[idx] == rhs_members[idx]) {
>> mismatch_found = true;
>> break;
>> }
>> }
>>
>> // If no such index exists, ...
>> if (not mismatch_found) {
>> return true; // ... V is true.
>> } else { // Otherwise, ...
>> return false; // ... V is false.
>> }
>>
>> The first part describes the side effects of the defaulted definition, and
>> the short-circuiting in particular. The second part describes the returned
>> value.
>>
>> Obviously this can be written more clearly and concisely in pseudocode.
>> Would be nice if it could similarly be simplified in English.
>>
>
>Close, but `not` doesn't necessarily do what it should. I'd say this would
>be more correct and idiomatic:
Yes, you are right. At first I wanted to write !=, but then I "corrected" myself... It's pseudocode :)
>/* ...comparing corresponding elements xi and yi in the expanded lists of
>subobjects for x and y (in increasing index order) until the first index i
>where xi == yi yields a result value which, when contextually converted to
>bool, yields false. */
>size_t idx=0;
>for (; idx != member_count; ++idx) {
> if (lhs_members[idx] == rhs_members[idx]) {
> ;
> } else {
> break;
> }
>}
>
>// If no such index exists, ...
>if (idx == member_count) {
> return true; // ... V is true.
>} else { // Otherwise, ...
> return false; // ... V is false.
>}
I wonder if the English wording would be clearer if the if-else would be switched around.
The current wording reads like:
if (no such index exists) {
V is true
} else {
V is false
}
I try to avoid if(!cond)...else in code, as now the else branch has a double negative.
Replacing the last part of the wording with this might be clearer:
"If such index exists, V is false. Otherwise V is true."
Of course in real code I would just return from the loop on mismatch, but I don't know how to convey that in English.
It's tricky; English (and in particular Standardese) isn't really lent to conveying that kind of algorithm. Quite honestly I don't feel that there's much need to improve the wording; most people who read the specification itself will know how to write a short-circuiting equality operator anyway, so need only check that the wording can be read with that in mind.
Cheers,
Lénárd