The
Scheme Request for
Implementation, or
SRFI, documents are a series of
consensus standards for
Scheme constructs which are commonly used but not defined in
R5RS or
IEEE Scheme. The existing
Scheme standards define a very small language, only slightly larger than
C without the
standard library. There are many constructs which are useful in practical programming, such as
record types, richer
list and
string libraries, and a
require system for declaring
library procedures, which are not specified. The result is that every
Scheme implementation has slightly different (and differently
buggy) versions, so that you don't program in
Scheme so much as in
SCM or
Guile or
MzScheme. The
SRFI documents attempt to address this problem. (Aubrey Jaffer's
SLIB library is another solution; if you like the constructs it provides you can use them in any
Scheme.)
SRFIs accepted so far (23 August 2001) are:
- SRFI-0: Feature-based conditional expansion construct. cond-expand is a macro that detects whether a given feature is available in your Scheme implementation when it is expanded.
- SRFI-1: List library. Piles and piles of useful stuff, much richer than the R5RS list functions.
- SRFI-2: and-let*: an and with local bindings, a guarded let* special form. A technical construct that tests and binds values at once.
- SRFI-4: Homogeneous numeric vector datatypes. Like C++ valarray, a vector type that permits efficient numeric implementation. (True to the dynamically typed nature of Scheme, core Scheme vectors are heterogeneous; a C programmer might think of them as arrays of void *.)
- SRFI-5: A compatible let form with signatures and rest arguments. Minor syntactic extensions to the ability to define procedures with the let special form.
- SRFI-6: Basic string ports. The ability to open a string as a port (the I/O type of Scheme). C++ programmers think strstream.
- SRFI-7: Feature-based program configuration language. A unified proposal for the ability to require or test for the presence of a given feature in a Scheme implementation.
- SRFI-8: receive: binding to multiple values. A dual to the values form which is simpler to use than the R5RS call-with-values.
- SRFI-9: Defining record types. The sorely needed addition of standardized record (structure) types to Scheme.
- SRFI-10: sharp-comma external form. Introduces the token #,(...) as an open-ended extension to Scheme read syntax.
- SRFI-11: Syntax for receiving multiple values. Supplements call-with-values and receive with let-values and let*-values which do the expected thing.
- SRFI-13: String library. Again, piles and piles of useful stuff.
- SRFI-14: Character-set library. SRFIs 13 and 14 had the same author (Olin Shivers of scsh) and together form a character and string library as rich as the C++ standard library.
- SRFI-16: Syntax for procedures of variable arity. Introduces the case-lambda form for pattern matching on the form of a procedure invocation, removing the need to explicitly destructure a "rest" arguments list.
- SRFI-17: Generalized set!. Makes any expression that evaluates to a location cell, rather than just an identifier, a permissible "lvalue" for set!.
- SRFI-18: Multithreading support. Defines a standard thread library.
- SRFI-19: Time data types and procedures. Introduces time as a new primitive data type and provides operations.
- SRFI-21: Real-time multithreading support. Extends the SRFI-18 thread library with timing primitives.
- SRFI-23: Error reporting mechanism. Standardizes the commonly available error procedure.