# Functions

#### Synopsis

Functions and pattern-directed invocation.

#### Description

Functions allow the definition of frequently used operations. They have a name and formal parameters. They are explicitly declared and are fully typed. Functions can also be used as values thus enabling higher-order functions. Rascal is a higher-order language in which functions are first-class values.

See Function Declaration for details.

#### Examples

Here is an example of a function that counts the number of assignment statements in a program:

`int countAssignments(PROGRAM P){`

int n = 0;

visit (P){

case asgStat(_, _):

n += 1;

}

return n;

}

Consider the following use of higher-order functions:

`int double(int x) { return 2 * x; }`

int triple(int x) { return 3 * x; }

int f(int x, int (int) multi){ return multi(x); }

The functions `double`

and `triple`

multiply their argument with a constant.
Function `f`

is, however, more interesting.
It takes an integer `x`

and a function `multi`

(with integer argument and integer result) as argument and
applies multi to its own argument. `f(5, triple)`

will hence return `15`

.
Function values can also be created anonymously as illustrated by the following, alternative,
manner of writing this same call to `f`

:

`f(5, int (int y){return 3 * y;});`

Here the second argument of `f`

is an anonymous function.