Functions
Functions are expressions that produce a value that can be called to produce another value.
In Fuzion, functions are purely syntactic sugar. Depending on the presence of
a function result, functions are features that inherit from
feature Function
or Routine
from the fuzion standard
library.
Function Types
Function types are introduced by the keywordfun
followed by a list
of comma-separated argument types enclosed in parentheses and an optional
result. The list of argument types can be empty, but the parentheses are always
required.
Function Values using Inline Code
Function values are expressions enclosed in parentheses followed by a list of
arguments, then ->
, and followed by a feature declaration without a
feature name. The following expressions give valid function values:
(x -> x>=0) // a function with i32 argument that returns a bool (() -> "Hello") // a function without argument that returns a String (() -> out.print("Hello")) // a function value that prints Hello (a, b -> a + b) // a function that returns the sum of two arguments
The following code gives an example of a feature eval
that receives
an argument f
of a function type and calls this with
arguments 0
, 1
,
2
, and 3
.
Syntactic sugar allows to simplify this code: First, the
call f.call x
can be simplified to f x
since the
compiler inserts the call if a field of function type is followed by a list of
actual arguments.
The simplified example hence becomes
The argument and result types in expressions such as
(x -> 2*x)
is inferred automatically from the type signature in features that accept a function as an argument:
eval(msg String, f i32 -> i32) is { }
Function Values using Calls
Alternatively to inline code, function values could be defined as a call to
an existing feature. In this case, a call without argument list is given after
the keyword fun
as in
f := fun target.featwhich will be translated to
internal_field := target f := fun (a A, b B, ...) => internal_field.feat a b ...
Here is the previous example using
features double
, squared
and pow.calc
as
function values: