开发者

What languages have a while-else type control structure, and how does it work?

A long time ago, I thought I saw a proposal to add an else clause to for or while loops in C or C++... or something like th开发者_StackOverflow社区at. I don't remember how it was supposed to work -- did the else clause run if the loop exited normally but not via a break statement?

Anyway, this is tough to search for, so I thought maybe I could get some CW answers here for various languages.

What languages support adding an else clause to something other than an if statement? What is the meaning of that clause? One language per answer please.


Python.

Example use:

for element in container:
  if element == target:
    break
else:
  # this will not be executed if the loop is quit with break.
  raise ElementNotFoundError()

From the Python docs:

it is executed when the loop terminates through exhaustion of the list (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement.


There is so-called "Dijkstra's Loop" (also called "Dijkstra's Guarded Loop"). It was defined in The Guarded Command Language (GCL). You can find some information about it syntax and semantic in the above Wikipedia article at the section 6 Repetition: do.

Nowadays I actually know one programming language which supports this control struture directly. It is Oberon-07 (PDF, 70 KB). And it supports "Dijkstra's Loop" in thу form of while statement. Take a look at section 9.6. While statements in the above PDF.

WHILE m > n DO m := m – n 
ELSIF n > m DO n := n – m 
END


Interestingly, neither the Python or the Oberon construct are the one I've been searching for. In C, I frequently find myself often wanting an 'otherwise' or 'elsewhile' construct that is executed only if the loop was never taken. Perhaps this is the construction you are looking for as well?

So instead of:

if (condition) {
   do {
       condition = update(something);
   } while (condition);  
} else {
   loop_never_taken(something);
}

I could write:

while (condition) {
    condition = update(something);
} otherwhile {
    loop_never_taken(something);
}

It's definitely shorter, and I would find it much clearer to read. It even translates easily into (pseudo) assembly:

    while: test condition
           bz elsewhile
     loop: push something    
           call update
     test: test condition
           bnz loop
           jmp done         
elsewhile: push something
           call loop_never_taken
     done: ...

I feel like it's a basic enough structure that it deserves a little more sugar. But apparently there haven't been any successful language designers who rely on this structure as much as I do. I wonder how much I should read into that!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜