Proposal of a general do-while loop
Tomas Lindquist Olsen
tomas at famolsen.dk
Tue Jul 17 05:11:43 PDT 2007
On Tue, 17 Jul 2007 03:04:11 -0400, Taro Kawagishi wrote:
> Hello all,
>
> every once in a while I feel uneasy when I find I can't fit my logic into
> a do-while or while loop in a concise way. Here is a C++ example:
>
> void
> find_string_occurrences(const string& text, const string& pattern) {
>
> // listing 1
> size_t pos = text.find(pattern, 0);
> while (pos != string::npos) {
> cout << "pattern found at " << pos << "\n"; ++pos;
> pos = text.find(pattern, pos);
> }
> }
>
> }
> The way the code is written might look redundant in calling find() twice,
> but I think it is reasonable because you can test the loop condition only
> after you run function find() but here you can't use a do-while loop which
> doesn't allow you to place other statements after the condition statement.
>
> I can write the same logic as in listing 2 and 3 below, but their meanings
> would be less clear than listing 1, because the looping condition is in
> the if statement together with the break statement in it, and you need to
> spot the if statement in the while body to understand it.
>
> // listing 2
> size_t pos = 0;
> while (true) {
> pos = text.find(pattern, pos);
> if (pos == string::npos) {
> break;
> }
> cout << "pattern found at " << pos << "\n"; ++pos;
> }
> }
> // listing 3
> size_t pos = 0;
> do {
> pos = text.find(pattern, pos);
> if (pos == string::npos) {
> break;
> }
> cout << "pattern found at " << pos << "\n"; ++pos;
> } while (true);
>
> I think a more natural way to express the logic is to write the code as in
> listing 4.
>
> // listing 4
> size_t pos = 0;
> do {
> pos = text.find(pattern, pos);
> } while (pos != string::npos) {
> cout << "pattern found at " << pos << "\n"; ++pos;
> }
> }
> The meaning of
>
> do {
> aa;
> } while (bb) {
> cc;
> }
> }
> is
>
> while (true) {
> aa;
> if (not bb) {
> break;
> }
> cc;
> }
> }
> and is a natural extension to both of
>
> do {
> aa;
> } while (bb);
>
> and
>
> while (bb) {
> cc;
> }
> }
> The current while loop and do-while loop will be specialized forms of this
> general do-while loop.
>
> The advantage of the new construct will be seen if you have more complex
> statements within do and while blocks. I believe allowing this extended
> construct will be smooth since it will not break the existing code. I
> think D language would be a great fit to have this feature because the
> language seems to be still evolving.
I dont see any reason to further complicate the language for this. As you
already pointed out yourself it can be easily accomplished with the
current language features.
Here's mine:
for(;;)
{
aa;
if (!cond) break;
bb;
}
- Tomas
More information about the Digitalmars-d
mailing list