<SPAN CLASS="TOKEN" >break!</SPAN > expressions

Sather - Language Specification
Prev | Chapter 8. Loops and Iterators | Next

# 8.6. break! expressions

Example 8-6. Example:

    break!

    break!_expression ==>
            break!

break! expressions are iterator calls which immediately quit when they are called.

## 8.6.1. Iterator Examples

Example 8-7. Because they are so useful, the 'while!', 'until!' and 'break!' iterators are built into the language. Here's how 'while!' could be written if it were not a primitive.

    while!(pred:BOOL) is
       -- Yields as long as 'pred' is true
       loop
          if pred then yield
          else quit
          end
       end
    end

Example 8-8. The built-in class 'INT' defines some useful iterators. Here's the definition of 'upto!'. Unlike the argument 'pred' used above, 'i' here is declared to be 'once'; when 'upto!' is called, the argument is only evaluated once, the first time the iterator is called in the loop.

    upto!(once i:SAME):SAME is
       -- Yield successive integers from
       -- self to 'i' inclusive.
       r::=self;
       loop
          until!(r>i);
          yield r;
          r:=r+1
       end
    end;

Example 8-9. To add up the integers 1 through 10, one might say:

    x::=0;
    loop
       x:=x+1.upto!(10)
    end

Example 8-10. Or, using the library iterator 'sum!' like this. 'x' needs to be declared (but not initialized) outside the loop.

    loop
       x:=INT::sum!(1.upto!(10))
    end

Example 8-11. Some of the most useful ways to use iters is with container objects. Arrays, lists, sets, trees, strings, and vectors can all be given iterators to yield all their elements. Here we print all the elements of some container 'c'.

    loop
       #OUT + c.elt!.str + '\n'
    end

Example 8-12. This doubles the elements of array 'a'.

    loop a.set!(a.elt! * 2) end

Example 8-13. This computes the dot product of two vectors 'a' and 'b'. There is also a built-in method 'dot' to do this. 'x' needs to be declared (but not initialized) before the loop.

    loop
       x:=sum!(a.elt! * b.elt!)
    end

Prev | Home | Next
until! expressions | Up | Closures