# contingent

I finished implementing the 'contingent' control structure yesterday, which completes the set of Rogue control structures.

Contingents allow you to "bail out early" of a logical test, similar to a 'return' or a try/catch/throw but used for local logic instead of cross-method exceptions.

The syntax is this:

```
contingent
# any mix of statements along with:
necessary (x) # jump to 'unsatisfied' if x is false
sufficient (y) # jump to 'satisfied' if y is true
# fall through to 'satisfied'
satisfied
# statements
unsatisfied
# statements
endContingent
```

Here's an example that prints out which integers between 1 and 100 are prime:

```
forEach (n in 1..100)
contingent
# Only numbers 2+ can be prime
necessary (n > 1)
# 2 is a prime number
sufficient (n == 2)
# Any other even number is not prime
necessary (n & 1 == 1)
# Mod the number with odd numbers 3..sqrt(n).
forEach (divisor in 3..Math.sqrt(n) step 2)
# Remainders must be non-zero
necessary (n % divisor)?
endForEach
satisfied
println n + " is prime"
endContingent
endForEach
```