Functions can be written using several types of syntax

```
function name()
integer name
name = 42
end function
```

```
integer function name()
name = 42
end function
```

```
function name() result(res)
integer res
res = 42
end function
```

Functions return values through a *function result*. Unless the function statement has a `result`

clause the function's result has the same name as the function. With `result`

the function result is that given by the `result`

. In each of the first two examples above the function result is given by `name`

; in the third by `res`

.

The function result must be defined during execution of the function.

Functions allow to use some special prefixes.

*Pure* function means that this function has no side effect:

```
pure real function square(x)
real, intent(in) :: x
square = x * x
end function
```

*Elemental* function is defined as scalar operator but it can be invoked with array as actual argument in which case the function will be applied element-wise. Unless the `impure`

prefix (introduced in Fortran 2008) is specified an *elemental* function is also a *pure* function.

```
elemental real function square(x)
real, intent(in) :: x
square = x * x
end function
```