template function which can iterate on STL containers and call a unary function for each element. The functionality also can be constructed as macro on these containers. Count-controlled looping is effected by iteration across an integer interval; early exit by including an additional condition for exit. Eiffel supports a reserved word retry, however it is used in exception handling, not loop control. Requires Java Modeling Language (JML) behavioral interface specification language. Requires loop variants to be integers; transfinite variants are not supported. D supports infinite collections, and the ability to iterate over those collections. This does not require any special construct. Deep breaks can be achieved using GO TO and procedures. Common Lisp predates the concept of generic collection type. Structured non-local control flow Many programming languages, especially those favoring more dynamic styles of programming, offer constructs for non-local control flow. These cause the flow of execution to jump out of a given context and resume at some predeclared point. Conditions, exceptions and continuations are three common sorts of non-local control constructs; more exotic ones also exist, such as generators, coroutines and the async keyword. Conditions PL/I has some 22 standard conditions (e.g., ZERODIVIDE SUBSCRIPTRANGE ENDFILE) which can be raised and which can be intercepted by: ON condition action; Programmers can also define and use their own named conditions. Like the unstructured if, only one statement can be specified so in many cases a GOTO is needed to decide where flow of control should resume. Unfortunately, some implementations had a substantial overhead in both space and time (especially SUBSCRIPTRANGE), so many programmers tried to avoid using conditions. Common Syntax examples: ON condition GOTO label Exceptions Modern languages have a specialized structured construct for exception handling which does not rely on the use of GOTO or (multi-level) breaks or returns. For example, in C++ one can write: try { xxx1 // Somewhere in here xxx2 // use: '''throw''' someValue; xxx3 } catch (someClass& someId) { // catch value of someClass actionForSomeClass } catch (someType& anotherId) { // catch value of someType actionForSomeType } catch (...) { // catch anything not already caught actionForAnythingElse } Any number and variety of catch clauses can be used above. If there is no catch matching a particular throw, control percolates back through subroutine calls and/or nested blocks until a matching catch is found or until the end of the main program is reached, at which