Skip to main content

Function

Entrypoints' effect may call functions. A function returns a value, may fail, and can change the contract storage.

A function is declared with the function keyword followed by a unique identifier.

return​

A function may return a value; it then uses the return keyword. The return type is specified after the function arguments declaration, followed by :.

For example, the following function implements the Horner's formula of the exponential function:

function exp(x : rational, steps : nat) : rational {
var r : rational = 1 + x / steps;
iter i to steps - 1 do
r := 1 + x * r / (steps - i)
done;
return r
}

When the function does not change the storage, it is compiled as a lambda expression on the stack. When the function does change the storage, it is inlined.

Function as instruction​

The return value, and the return type declaration, are optional. In that case, the function is considered as an instruction. For example, the function set_res below simply assigns a value to a storage variable:

archetype example

variable res : nat = 0

function set_res(v : nat) {
res := v
}

entry exec() {
set_res(42)
}

Such functions are inlined, even if they do not change the contract's storage.

Inlining strategy​

A function that does not modify the storage nor emit operations is inlined. Any other function is compiled as a lambda expression.

In views a function is always inlined.