Han-Wen Nienhuys <[email protected]> writes:

> On Thu, Jan 13, 2011 at 10:19 AM, David Kastrup <[email protected]> wrote:
>>
>> Hi,
>>
>> in note-collision.cc I read the following:
>>
>>  Direction d = UP;
>>  do
>>    {
>>      vector<Grob*> &clashes (clash_groups[d]);
>>      vector_sort (clashes, Note_column::shift_less);
>>    }
>>  while ((flip (&d)) != UP);
>>
>> Uh, is there any reason not to just write
>>
>>  vector_sort (clash_groups[UP], Note_column::shift_less);
>>  vector_sort (clash_groups[DOWN], Note_column::shift_less);
>>
>> I find it somewhat strange to make a loop for two simple function calls.
>
> In this particular case it may not matter, but the
>
>   while ((flip(&d) != UP)
>
> is a common idiom in the lilypond source code, and you should get used
> to it reading the source code.

It is not a pretty idiom.  Something like

    for (d in [UP,DOWN]) ...

would be much nicer and clearer.  Doesn't C++ have some more useful
idiom for iterators or so?

I think I might even prefer

    while ((flip(&d) == DOWN)

since in that way at least both directions are mentioned.  But the whole
flipping business seems awkward when just two directions are involved.

Something like

    for (d=UP;;d=DOWN) {
      ...
      if (d == DOWN)
         break;
    }

would be somewhat prettier in my book and involve less calculation.

> Overall, I prefer to have programmatic constructs (like this while
> loop) over unrolling loops by hand, and making symmetry of left/right
> and up/down explicit in this way.

Uh, a loop with a single simple function call in it?

-- 
David Kastrup

_______________________________________________
lilypond-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to