Sequential
By default, Aqua code is executed line by line, sequentially.
Contract
- Data from the first line is available on the second line
- A second line will be executed only if the first line succeeded
- If any line failed, then the whole block is failed
- If all lines succeeded, then the whole block is succeeded
aqua
f <- first() -- first linesecond(f) -- second line
aqua
f <- first() -- first linesecond(f) -- second line
A block of code is any number of lines on the same indentation level or deeper.
Sequential operations
call arrow
Any runnable piece of code in Aqua is an arrow from its domain to the codomain.
aqua
-- Call a functionfoo()-- Call a function that returns something, assign results to a variablex <- foo()-- Call an ability functiony <- Peer.identify()-- Pass an argumentz <- Op.identity(y)
aqua
-- Call a functionfoo()-- Call a function that returns something, assign results to a variablex <- foo()-- Call an ability functiony <- Peer.identify()-- Pass an argumentz <- Op.identity(y)
When you write <-
, this means not just "assign results of the function on the right to variable on the left". It means that all the effects are executed: service may change state, the topology may be shifted. But you end up being (semantically) on the same peer where you have called the arrow.
on
on
denotes the peer where the code must be executed. on
is handled sequentially, and the code inside is executed line by line by default.
aqua
func foo():-- Will be executed where `foo` was executedbar()-- Move to another peeron another_peer:-- To call bar, we need to leave the peer where we were and get to another_peer-- It's done automaticallybar()on third_peer via relay:-- This is executed on third_peer-- But we denote that to get to third_peer and to leave third_peer-- an additional hop is needed: get to relay, then to peerbar()-- Will be executed in the `foo` call site again-- To get from the previous `bar`, compiler will add a hop to relaybar()
aqua
func foo():-- Will be executed where `foo` was executedbar()-- Move to another peeron another_peer:-- To call bar, we need to leave the peer where we were and get to another_peer-- It's done automaticallybar()on third_peer via relay:-- This is executed on third_peer-- But we denote that to get to third_peer and to leave third_peer-- an additional hop is needed: get to relay, then to peerbar()-- Will be executed in the `foo` call site again-- To get from the previous `bar`, compiler will add a hop to relaybar()
See more in the Topology section.