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

\name{CallExternal}
\alias{.Call}
\alias{.External}
\title{Modern Interfaces to C/C++ code}
\description{
  Functions to pass \R objects to compiled C/C++ code that has been
  loaded into \R.
}
\usage{
    .Call(.NAME, \dots, PACKAGE)
.External(.NAME, \dots, PACKAGE)
}
\arguments{
  \item{.NAME}{a character string giving the name of a C function,
    or an object of class \code{"\link{NativeSymbolInfo}"},
    \code{"\link{RegisteredNativeSymbol}"} or
    \code{"\link{NativeSymbol}"} referring to such a name.}

  \item{\dots}{arguments to be passed to the compiled code. Up to 65 for
    \code{.Call}.}

  \item{PACKAGE}{if supplied, confine the search for a character string
    \code{.NAME} to the DLL given by this argument (plus the
    conventional extension, \file{.so}, \file{.dll}, \dots).

    This argument follows \code{...} and so its name cannot be abbreviated.

    This is intended to add safety for packages, which can ensure by
    using this argument that no other package can override their
    external symbols, and also speeds up the search (see \sQuote{Note}).}
}

\details{
  The functions are used to call compiled code which makes use of
  internal \R objects, passing the arguments to the code as a sequence
  of \R objects.  They assume C calling conventions, so can usually
  also be used for C++ code.

  For details about how to write code to use with these functions see
  the chapter on \sQuote{System and foreign language interfaces} in
  the \sQuote{Writing R Extensions} manual.  They differ in the way the
  arguments are passed to the C code:  \code{.External} allows for a
  variable or unlimited number of arguments.

  These functions are \link{primitive}, and \code{.NAME} is always
  matched to the first argument supplied (which should not be named).
  For clarity, avoid using names in the arguments passed to \code{\dots}
  that match or partially match \code{.NAME}.
}

\value{
  An \R object constructed in the compiled code.
}

\section{Header files for external code}{
  Writing code for use with these functions will need to use internal \R
  structures defined in \file{Rinternals.h} and/or the macros in
  \file{Rdefines.h}.
}

\note{
  If one of these functions is to be used frequently, do specify
  \code{PACKAGE} (to confine the search to a single DLL) or pass
  \code{.NAME} as one of the native symbol objects.  Searching for
  symbols can take a long time, especially when many namespaces are loaded.

  You may see \code{PACKAGE = "base"} for symbols linked into \R.  Do
  not use this in your own code: such symbols are not part of the API
  and may be changed without warning.

  \code{PACKAGE = ""} used to be accepted (but was undocumented): it is
  now an error.
}

\references{
  Chambers, J. M. (1998)
  \emph{Programming with Data.  A Guide to the S Language}.
  Springer. (\code{.Call}.)
}
\seealso{
  \code{\link{dyn.load}}, \code{\link{.C}}, \code{\link{.Fortran}}.

  The \sQuote{Writing R Extensions} manual.
}
\keyword{programming}
