# Controlling evaluation¶

Evaluation is controlled by

• iterators for iteration
• conditional evaluation
• explicit return from a lambda
• signalling and trapping errors
• control words

## Iterators¶

Iterators are the primary means of iterating in q.

### Maps¶

The maps Each, Each Left, Each Right, Each Parallel, and Each Prior are iterators that apply values across the items of lists and dictionaries.

### Accumulators¶

The accumulators Scan and Over are iterators that apply values progressively: that is, first to argument/s, then progressively to the result of each evaluation.

For unary values, they have three forms, known as Converge, Do, and While.

### Case¶

There is no case or switch control word in q. Use the Case iterator instead. Or a dictionary.

## Conditional evaluation¶

Syntax: ?[x;y;z]

Cond returns z when x is zero; else y.

Two arguments are evaluated: x and either y or z.

Vector Conditional does something similar for lists of arguments, but evaluates all three arguments.

## Explicit return¶

Syntax: :x

The result of a lambda is the last expression in its definition, unless the last expression is empty or an assignment, in which case the lambda returns the generic null ::.

:x has a lambda terminate and return x.

q)foo:{if[0>type x;:x]; x cross x}
q)foo 2 3
2 2
2 3
3 2
3 3
q)foo 3
3


## Signalling and trapping errors¶

Signal will exit the lambda under evaluation and signal an error to the expression that invoked it.

q)goo:{if[0>type x;'type]; x cross x}
q)goo 2 3
2 2
2 3
3 2
3 3
q)goo 3
'type
[0]  goo 3
^


Trap and Trap At set traps to catch errors.

## Control words¶

do

evaluate some expression/s some number of times

if

evaluate some expression/s if some condition holds

while`

evaluate some expression/s while some condition holds

Control words are not functions, cannot be arguments or list items, and do not return results.

Control words are little used in practice for iteration. Iterators are more commonly used.