Values
Last updated
Was this helpful?
Last updated
Was this helpful?
Aqua is all about combining data and computations. The runtime for the compiled Aqua code, , 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.
Values in Aqua are backed by VDS (Verifiable Data Structures) in the runtime. All operations on values must keep the authenticity of data, prooved by signatures under the hood.
That's why values are immutable. Changing the value effectively makes a new one:
More on that in the Security section. Now let's see how we can work with values inside the language.
Function arguments are available within the whole function body.
You can assign the results of an arrow call to a name and use this returned value in the code below.
Aqua functions may return more than one value.
Aqua offers a list of arithmetic and logic operators, introduced in Aqua 0.7.1.
Aqua provides syntax sugar for creating any of the collection types with [ ... ]
for arrays, ?[ ... ]
for optional values, *[ ... ]
for streams.
The ?[]
expression takes any number of arguments, but returns an optional value that contains only 0
or 1
value. This is done by trying to yield these values one by one. The first value that yields without an error will be added to the resulting option.
As of Aqua 0.6.3
, it is not possible to get an element by index directly from the collection creation expression.
In Aqua, you can use a getter to peek into a field of a product or indexed element in an array.
Note that the !
operator may fail or halt:
The !
operator can currently only be used with literal indices.
That is,!2
is valid but!x
is not valid.
To access an index with non-literal, use the brackets index, like [x].
Assignments, =
, only give a name to a value with an applied getter or to a literal.
Constants are like assignments but in the root scope. They can be used in all function bodies, textually below the place of const definition. Constant values must resolve to a literal.
You can change the compilation results by overriding a constant but the override needs to be of the same type or subtype.
Constants are always UPPER_CASE
.
Visibility scopes follow the contracts of execution flow.
By default, everything defined textually above is available below. With some exceptions.
Functions have isolated scopes:
To use a stream, you need to initiate it at first:
Aqua supports just a few literals: numbers, quoted strings, booleans, and nil
. You in Aqua, only obtain it as a result of a function call.
With Aqua it is possible to create a , fill it with values, and use in place of any collection:
If it is called on an immutable collection, it will fail if the collection is shorter and has no given index; you can handle the error with or .
If it is called on an appendable stream, it will wait for some parallel append operation to fulfill, see .
does not export anything from it:
branches have to each other's data:
Recovery branches in have no access to the main branch as the main branch exports values, whereas the recovery branch does not:
Stream is a special data structure that allows many writes. It has .
One of the most frequently used patterns for streams is .
You can create a stream with operators.