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
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
. 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.