Aqua is all about combining data and computations. Underlying runtime \([AquaVM](https://github.com/fluencelabs/aquavm)\) tracks what data comes from what origin, which constitutes the foundation for distributed systems security. That approach, driven by π-calculus and security considerations of open-by-default networks and distributed applications as custom application protocols, also puts constraints on the language that configures it.
Namely, values form VDS \(Verifiable Data Structures\). All operations on values must retain security invariants. Hence values are immutable, except [writeable collections](types.md#collection-types) \(streams\).
Aqua supports just a few literals: numbers, quoted strings, booleans. You [cannot make a structure](https://github.com/fluencelabs/aqua/issues/167) in Aqua.
```text
-- String literals cannot contain double quotes
foo("double quoted string literal")
-- Booleans are true and false
if x == false:
foo("false is a literal")
-- Numbers are different
-- Any number:
bar(1)
-- Signed number:
bar(-1)
-- Float:
bar(-0.2)
```
### Getters
In Aqua, you can use a getter to peak into a field of a product, or indexed element in an array.
* If it is called on an immutable collection, it will fail if collection is shorter and has no given index; you can handle it with [try](operators/conditional.md#try) or [otherwise](operators/conditional.md#otherwise).
* If it is called on an appendable stream, it will wait for some parallel append operation to fulfill, see [Join behavior](operators/parallel.md#join-behavior).
`!` operator cannot be used with non-literal indices: you can use `!2`, but not `!x`. It's planned to be fixed.
By default, everything defined textually above is available below. With some exceptions.
Functions have isolated scopes:
```text
func foo():
a = 5
func bar():
-- a is not defined in this function scope
a = 7
foo() -- a inside fo is 5
```
[For loop](operators/iterative.md#export-data-from-for) does not export anything from it:
```text
func foo():
x = 5
for y <-ys:
-- Can use what was defined above
z <-bar(x)
-- z is not defined in scope
z = 7
```
[Parallel](operators/parallel.md#join-behavior) branches have [no access](https://github.com/fluencelabs/aqua/issues/90) to each other's data:
```text
-- This will deadlock, as foo branch of execution will
-- never send x to a parallel bar branch
x <-foo()
par y <-bar(x)
-- After par is executed, all the can be used
baz(x, y)
```
Recovery branches in [conditional flow](operators/conditional.md) has no access to the main branch. Main branch exports values, recovery branch does not: