SPL functions
SPL functions are written directly in SPL, not natively in the languages C++ or Java™.
float64 toCelsius(float64 fahrenheit) {
float64 freezing = 32f, ratio = 5f / 9f;
return (fahrenheit - freezing) * ratio;
}functionDef ::= functionHead blockStmt
functionHead ::= functionModifier* type ID '(' functionFormal*, ')'
functionModifier ::= 'public' | 'stateful'
functionFormal ::= 'mutable'? type IDThe function head contains optional modifiers, the return type, identifier, and list of parameter definitions.
The modifiers stateful for
functions and mutable for function parameters are
described from the caller's perspective in Side-effects. From the perspective
of the function body, they restrict what it can do: the body of function f1 can
call only a stateful function f2 if f1 is
declared stateful too, and the body of a function can modify only
a function parameter if that parameter is declared mutable.
The
modifier public for SPL functions makes the function
visible from other namespaces. Without the modifier, SPL functions
are private and only visible in their own namespace. Distinguishing
public from private functions helps in large projects because internal
helper functions do not become part of the public interface, and because
access to stateful private functions is restricted to code that is
aware of the invariants for the state.