Function expressions¤
Overview¤
!ARGUMENT,!ARG: Gets a function argument.!FUNCTION,!FN: Defines a new function.!SELF: Applies the current function, used for recursion.
!ARGUMENT, !ARG¤
Provides an access to an argument name.
Type: Scalar.
Synopsis:
!ARGUMENT name
or
!ARG name
Tip
!ARG is an concise version of !ARGUMENT.
!FUNCTION, !FN¤
The !FUNCTION expression defines a new function.
It is typically used as a top-level expression.
Type: Mapping.
Info
SP-Lang expressions are implicitly_placed function definition.
It means that in a majority of cases, the expression !FUNCTION can be skipped, and only do section is provided.
Synopsis:
!FUNCTION
name: <name of function>
arguments:
arg1: <type>
arg2: <type>
...
returns: <type>
schemas: <dictionary of schemas>
do:
<expression>
Tip
!FN is an concise version of !FUNCTION.
Example
!FUNCTION
arguments:
a: si64
b: si32
c: si32
d: si32
returns: fp64
do:
!MUL
- !ARGUMENT a
- !ARGUMENT b
- !ARGUMENT c
- !ARGUMENT d
This expression defines a function that takes four arguments (a, b, c, and d) with respective data types (si64, si32, si32, and si32) and returns a result of type fp64.
The function multiplies the four input arguments (a, b, c, and d) and returns the product as a floating-point number (fp64).
!SELF¤
The !SELF provides an ability to recursively apply "self" aka a current function.
Type: Mapping.
Synopsis:
!SELF
arg1: <value>
arg2: <value>
...
Note
!SELF expression is the so called Y combinator.
Example
!FUNCTION
arguments: {x: int}
returns: int
do:
!IF # value <= 1
test: !GT [!ARG x, 1]
then: !MUL [!SELF {x: !SUB [!ARG x, 1]}, !ARG x]
else: 1
This expression defines a recursive function that takes a single integer argument x and returns an integer result.
The function calculates the factorial of the input argument x using an if-else statement.
If the input value x is greater than 1, the function multiplies x by the factorial of (x - 1), computed by calling itself recursively.
If the input value x is 1 or less, the function returns 1.