Function Types
The function type is a type composed of input and output types.
Signature
<function_signature> ::= <type_signature> "->" <type_signature> ;
Dependencies:
The <function_signature>
consists of an input type signature and an output type signature,
separated by an arrow.
Note:
<type_signature>
also contains a tuple signature, therefore a function with multiple inputs and outputs is implicitly operating on a tuple.
Declaration
<function_declaration> ::=
"fn" <ident> "("
[(<ident> ":" <type_signature>) ("," <ident> ":" <type_signature>)* [","]]
")" ["->" "(" <type_signature> ("," <type_signature>)* [","] ")"] ;
Dependencies:
Assignment
<function_assignment> ::= <function_declaration> <code_block> ;
Dependencies:
The <function_assignment>
is defined as the "fn" keyword followed by its identifier, followed
by optional comma separated pairs of identifiers and type signatures, delimited by parenthesis, then
optionally followed by an arrow and a list of comma separated return types signatures delimited by
parenthesis, then finally the code block of the function body.
Arrow Functions
<arrow_function> ::= (<ident> | ("(" <ident> ("," <ident>)* [","] ")")) "=>" <code_block> ;
Dependencies:
The <arrow_function>
is defined as either a single identifier or a comma separated,
parenthesis delimited list of identifiers, followed by the "=>" bigram, followed by a code block.
Call
<function_call> ::= <ident> "(" [<expr> ("," <expr>) [","]] ")" ;
Dependencies:
The <function_call>
is an identifier followed by a comma separated list of expressions delimited
by parenthesis.
Semantics
todo