Sometimes when I am programming, I find that some particular control structure would be very useful to me, but is not directly available in my programming language. I think my most common desire is something like a "split while" (I have no idea what to actually call this):
{
foo();
} split_while( condition ) {
bar();
}
The semantics of this code would be that foo()
is always run, and then the condition is checked. If true, then bar()
is run and we go back to the first block (thus running foo()
again, etc). Thanks to a comment by reddit user zxqdms, I have learned that Donald E. Knuth writes about this structure in his paper "Structured programming with go to
statements" (see page 279).
What alternative control structures do you think are a useful way of organizing computation?
My goal here is to give myself and others new ways of thinking about structuring code, in order to improve chunking and reasoning.
Note: I'm not asking about how to generalize all possible control structures, whether by using jne
, if
/goto
, Lisp macros, continuations, monads, combinators, quarks, or whatever else. I'm asking what specializations are useful in describing code.
This is just a general idea and syntax:
ALSO condition is always evaluated. ELSE works as usual.
It works for case too. Probably it is a good way to eliminate break statement:
can be read as:
I don't know if this is useful or simple to read but it's an example.
This probably doesn't count, but in Python, I was upset there was no do loop.
Anto ensure I get no upvotes for this answer, I wind up annoyed at any language I work in for any period of time that lacks goto's.
I propose the "then" operator. It returns the left operand on the first iteration and the right operand on all other iterations:
in the first iteration it adds "" to the result in all others it adds ", ", so you get a string that contains each item separated by commas.
Also note that many control structures get a new meaning in monadic context, depending on the particular monad - look at mapM, filterM, whileM, sequence etc. in Haskell.
ignoring
- To ignore exceptions occuring in a certain block of code.With an
ignoring
control construct, you could write it more concisely and more readably as:[ Scala provides this (and many other Exception handling control constructs) in its standard library, in
util.control
package. ]Generators, in Python, are genuinely novel if you've mostly worked with non-functional languages. More generally: continuations, co-routines, lazy lists.