A typical function data type.
Function is named, takes zero or more arguments and has an optional return value. It
contains a collection of Blocks.
It also maintains a collection of local values which can be typically regarded as variables
existing in the function scope.