Control Flow. #
Cyber provides the common constructs to branch and enter loops.
Branching. #
Use if
and else
statements to branch the execution of your code depending on conditions. The else
clause can contain a condition which is only evaluated if the previous if or conditional else clause was false
.
a = 10
if a == 10:
print 'a is 10'
else a == 20:
print 'a is 20'
else:
print 'neither 10 nor 20'
An if
expression also needs the then
keyword. Conditional else
clauses are not allowed in an if
expression.:
a = 10
str = if a == 10 then 'red' else 'blue'
Use and
and or
logical operators to combine conditions:
a = 10
if a > 5 and a < 15:
print 'a is between 5 and 15'
if a == 20 or a == 10:
print 'a is 10 or 20'
Iterations. #
Infinite and conditional loops start with the while
keyword. An infinite loop continues to run the code in the block until a break
or return
is reached.
When the while
clause contains a condition, the loop continues to run until the condition is evaluated to false
.
-- Infinite loop.
while:
pass
running = true
while running:
-- Keep looping until `running` is false.
pass
for
loops can iterate over a range that starts at a number (inclusive) to a target number (exclusive). When the range operator ..
is replaced with ..=
, the target number is inclusive. The range can be given a custom step.
for 0..100 each i:
print i -- 0, 1, 2, ... , 99
for 0..100, 10 each i:
print i -- 0, 10, 20, ... , 90
for 100..0, 1 each i:
print i -- 100, 99, 98, ... , 1
for 100..=0, 1 each i:
print i -- 100, 99, 98, ... , 0
The for
clause can iterate over an Iterable
object. An Iterable type contains an iterator()
method that returns an Iterator
object. An Iterator type contains a next()
method that returns the next value or none
when finished.
You can iterate lists since they are Iterable.
list = [1, 2, 3, 4, 5]
-- Iterate on values.
for list each n:
print n
When the as
clause contains two variables, the for loop will iterate a PairIterable
object. A PairIterable type contains a pairIterator()
method that returns a PairIterator
object. A PairIterator type contains a nextPair()
method that returns two values or none
on the first value when finished.
The list object is also a PairIterable and the key is the index of the value in the list.
-- Iterate on values and indexes.
for list each i, n:
print '{i} -> {n}'
-- Iterate on just indexes.
for list each i, _:
print i
The for
clause can also iterate over maps with the same idea.
map = { a: 123, b: 234 }
-- Iterate on values.
for map each v:
print v
-- Iterate on values and keys.
for map each k, v:
print '{k} -> {v}'
-- Iterate on just keys.
for map each k, _:
print k
If you have an iterator already, you can use the optional for
loop to continue executing an expression until it is the none
value. Adding an as
clause will save the expression’s value to the given variable.
iter = dir.walk()
for iter.next() as entry:
print entry.name
You can exit a loop using break
.
for 0..10 each i:
if i == 4:
break
print i
-- This loop stops printing once `i` reaches 4.
You can skip the rest of the loop and go to the next iteration using continue
.
for 0..10 each i:
if i == 4:
continue
print i
-- This loop prints 0 through 9 but skips 4.
Matching. #
Matching is similar to a switch statement. The expression to the right of match
is evaluated and execution jumps to the declared case with the matching value. Multiple cases can be grouped together using a comma separator. An optional else
fallback case is executed when no other cases were matched.
val = 1000
match val:
0..100: print 'at or between 0 and 99'
100: print 'val is 100'
200:
print 'val is 200'
300, 400:
print 'combined case'
else:
print 'val is {val}'