@c -*-texinfo-*-
@c This is part of the GNU Guile Reference Manual.
@c Copyright (C)  2010, 2011, 2012, 2013,
@c   2014, 2019 Free Software Foundation, Inc.
@c See the file guile.texi for copying conditions.

@node R7RS Support
@section R7RS Support
@cindex R7RS

The @uref{https://small.r7rs.org/,R7RS} standard is essentially R5RS
(directly supported by Guile), plus a module facility, plus an
organization of bindings into a standard set of modules.

Happily, the syntax for R7RS modules was chosen to be compatible with
R6RS, and so Guile's documentation there applies.  @xref{R6RS
Libraries}, for more information on how to define R6RS libraries, and
their integration with Guile modules.  @xref{Library Usage}, also.

@menu
* R7RS Incompatibilities::              Guile mostly implements R7RS.
* R7RS Standard Libraries::             Modules defined by the R7RS.
@end menu

@node R7RS Incompatibilities
@subsection Incompatibilities with the R7RS

As the R7RS is a much less ambitious standard than the R6RS
(@pxref{Guile and Scheme}), it is very easy for Guile to support.  As
such, Guile is a fully conforming implementation of R7RS, with the
exception of the occasional bug and a couple of unimplemented features:

@itemize
@item
@cindex datum labels
The R7RS specifies a syntax for reading circular data structures using
@dfn{datum labels}, such as @code{#0=(1 2 3 . #0#)}.  Guile's reader
does not support this syntax currently;
@url{https://bugs.gnu.org/38236}.

@item
As with R6RS, a number of lexical features of R7RS conflict with Guile's
historical syntax.  In addition to @code{r6rs-hex-escapes} and
@code{hungry-eol-escapes} (@pxref{R6RS Incompatibilities}), the
@code{r7rs-symbols} reader feature needs to be explicitly enabled.
@end itemize

Guile exposes a procedure in the root module to choose R7RS defaults
over Guile's historical defaults.

@deffn {Scheme Procedure} install-r7rs!
Alter Guile's default settings to better conform to the R7RS.

While Guile's defaults may evolve over time, the current changes that
this procedure imposes are to add @code{.sls} and @code{.guile.sls} to
the set of supported @code{%load-extensions}, to better support R7RS
conventions.  @xref{Load Paths}.  @code{install-r7rs!} will also enable
the reader options mentioned above.
@end deffn

Finally, note that the @code{--r7rs} command-line argument will call
@code{install-r7rs!} before calling user code.  R7RS users probably want
to pass this argument to their Guile.

@node R7RS Standard Libraries
@subsection R7RS Standard Libraries

The R7RS organizes the definitions from R5RS into modules, and also adds
a few new definitions.

We do not attempt to document these libraries fully here, as unlike
R6RS, there are few new definitions in R7RS relative to R5RS.  Most of
their functionality is already in Guile's standard environment.  Again,
the expectation is that most Guile users will use the well-known and
well-documented Guile modules; these R7RS libraries are mostly useful to
users who want to port their code to other R7RS systems.

As a brief overview, we note that the libraries defined by the R7RS are
as follows:

@table @code
@item (scheme base)
The core functions, mostly corresponding to R5RS minus the elements
listed separately below, but plus SRFI-34 error handling
(@pxref{SRFI-34}), bytevectors and bytevector ports
(@pxref{Bytevectors}), and some miscellaneous other new procedures.
@item (scheme case-lambda)
@code{case-lambda}.
@item (scheme char)
Converting strings and characters to upper or lower case, predicates for
if a characer is numeric, and so on.
@item (scheme complex)
Constructors and accessors for complex numbers.
@item (scheme cxr)
@code{cddr}, @code{cadadr}, and all that.
@item (scheme eval)
@code{eval}, but also an @code{environment} routine allowing a user to
specify an environment using a module import set.
@item (scheme file)
@code{call-with-input-file} and so on.
@item (scheme inexact)
Routines that operate on inexact numbers: @code{sin}, @code{finite?},
and so on.
@item (scheme lazy)
Promises.
@item (scheme load)
The @code{load} procedure.
@item (scheme process-context)
Environment variables.  @xref{SRFI-98}.  Also, @code{commmand-line},
@code{emergency-exit} (like Guile's @code{primitive-_exit}), and
@code{exit}.
@item (scheme r5rs)
The precise set of bindings exported by @code{r5rs}, but without
@code{transcript-off} / @code{transcript-on}, and also with the
auxiliary syntax definitions like @code{_} or @code{else}.  @xref{Syntax
Rules}, for more on auxiliary syntax.
@item (scheme read)
The @code{read} procedure.
@item (scheme repl)
The @code{interaction-environment} procedure.
@item (scheme time)
@code{current-second}, as well as @code{current-jiffy} and
@code{jiffies-per-second}.  Guile uses the term ``internal time unit''
for what R7RS calls ``jiffies''.
@item (scheme write)
@code{display}, @code{write}, as well as @code{write-shared} and
@code{write-simple}.
@end table

For complete documentation, we advise the interested user to consult the
R7RS directly (@pxref{R7RS,,, r7rs, The Revised^7 Report on the
Algorithmic Language Scheme}).


@c Local Variables:
@c TeX-master: "guile.texi"
@c End:
