% File src/library/base/man/function.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2012 R Core Team
% Distributed under GPL 2 or later

\name{function}
\alias{function}
\alias{return}
\alias{closure}

\title{Function Definition}
\usage{
\special{function( arglist ) expr}
\special{return(value)}
}
\description{
  These functions provide the base mechanisms for defining
  new functions in the \R language.
}
\arguments{
    \item{arglist}{Empty or one or more name or name=expression terms.}
    \item{expr}{An expression.}
    \item{value}{An expression.}
}
\details{
  The names in an argument list can be back-quoted non-standard names
  (see \sQuote{\link{backquote}}).

  If \code{value} is missing, \code{NULL} is returned.  If it is a
  single expression, the value of the evaluated expression is returned.
  (The expression is evaluated as soon as \code{return} is called, in
  the evaluation frame of the function and before any
  \code{\link{on.exit}} expression is evaluated.)

  If the end of a function is reached without calling \code{return}, the
  value of the last evaluated expression is returned.
}

\section{Technical details}{
  This type of function is not the only type in \R: they are called
  \emph{closures} (a name with origins in LISP) to distinguish them from
  \link{primitive} functions.

  A closure has three components, its \code{\link{formals}} (its argument
  list), its \code{\link{body}} (\code{expr} in the \sQuote{Usage}
  section) and its \code{\link{environment}} which provides the
  enclosure of the evaluation frame when the closure is used.

  There is an optional further component if the closure has been
  byte-compiled.  This is not normally user-visible, but is indicated
  when functions are printed.
}

\seealso{
  \code{\link{args}}.

  \code{\link{formals}}, \code{\link{body}} and
  \code{\link{environment}} for accessing the component parts of a
  function.

  \code{\link{debug}} for debugging; using \code{\link{invisible}} inside
  \code{return(.)} for returning \emph{invisibly}.
}
\references{
  Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
  \emph{The New S Language}.
  Wadsworth & Brooks/Cole.
}
\examples{
norm <- function(x) sqrt(x\%*\%x)
norm(1:4)

## An anonymous function:
(function(x, y){ z <- x^2 + y^2; x+y+z })(0:7, 1)
}
\keyword{programming}
