A Scheme Request for Implementation (SRFI) is a proposal for a library or a syntax that Scheme implementations can offer. It is the way the Scheme community adds to the language without changing the reports. The numbering starts at 0, one number for each proposal, and the page for each is at srfi.schemers.org/srfi-N/. Programs name them in (import (srfi 1)) in R7RS, in (import (srfi :1 lists)) in R6RS (SRFI 97), in (use srfi-1) in CHICKEN, and in (cond-expand ((library (srfi 1)) ...)) to test for one.
Numbers and status
Each SRFI has a status. A draft is open for discussion; it becomes final when its editor and the SRFI editors judge it done, after which only errata change it; and it is withdrawn when its author or the editors give it up. The index page at the time this page was written lists 289 SRFIs, of which 216 are final, 12 are drafts and 61 are withdrawn (the page was read on 2026-11-13; the numbers keep growing). The index lets a reader filter by keyword, and its keywords include the Red and Tangerine editions of R7RS-large.
SRFIs in common use
Titles, status and dates are those of the index. A final SRFI’s date is the date it was finalised.
| SRFI | Title | Final | What the viewer knows of it |
|---|---|---|---|
| 0 | Feature-based conditional expansion construct | 1999-05-07 | cond-expand |
| 1 | List Library | 1999-10-09 | all its procedures as functions |
| 2 | AND-LET*: an AND with local bindings, a guarded LET* special form | 1999-03-01 | and-let* as syntax |
| 4 | Homogeneous numeric vector datatypes | 1999-05-22 | the #u8( #s16( #f64( prefixes |
| 6 | Basic String Ports | 1999-07-01 | open-input-string open-output-string get-output-string |
| 8 | receive: Binding to multiple values | 1999-08-30 | receive as syntax |
| 9 | Defining Record Types | 1999-09-09 | define-record-type, taken by R7RS |
| 10 | #, external form | 2000-01-13 | the #, mark |
| 11 | Syntax for receiving multiple values | 2000-03-15 | let-values let*-values, taken by R6RS and R7RS |
| 13 | String Libraries | 2000-12-28 | the string procedures as functions |
| 14 | Character-set Library | 2000-12-28 | not coloured |
| 16 | Syntax for procedures of variable arity | 2000-03-10 | case-lambda, taken by R6RS and R7RS |
| 17 | Generalized set! | 2000-07-24 | not coloured |
| 18 | Multithreading support | 2001-03-14 | not coloured |
| 19 | Time Data Types and Procedures | 2000-08-31 | not coloured |
| 22 | Running Scheme Scripts on Unix | 2002-01-20 | the #! first line |
| 23 | Error reporting mechanism | 2001-06-22 | error, taken by R7RS |
| 26 | Notation for Specializing Parameters without Currying | 2002-02-14 | cut and cute as syntax |
| 27 | Sources of Random Bits | 2002-06-03 | random-integer random-real make-random-source |
| 28 | Basic Format Strings | 2002-06-25 | format and its directives |
| 30 | Nested Multi-line Comments | 2002-08-07 | #| |#, taken by R6RS and R7RS |
| 31 | A special form rec for recursive evaluation | 2002-12-02 | rec as syntax |
| 34 | Exception Handling for Programs | 2002-12-01 | raise guard with-exception-handler, taken by R7RS |
| 35, 36 | Conditions; I/O Conditions | 2002-12-01 | not coloured |
| 38 | External Representation for Data With Shared Structure | 2003-04-02 | datum labels #0= #0#, taken by R7RS |
| 39 | Parameter objects | 2003-06-30 | make-parameter parameterize, taken by R7RS |
| 41 | Streams | 2008-01-24 | not coloured |
| 42 | Eager Comprehensions | 2003-07-07 | not coloured |
| 43 | Vector library | 2004-10-26 | its procedures as functions |
| 45 | Primitives for Expressing Iterative Lazy Algorithms | 2004-04-05 | delay-force make-promise, taken by R7RS |
| 46 | Basic Syntax-rules Extensions | 2005-02-28 | the custom ellipsis, taken by R7RS |
| 55 | require-extension | 2004-11-05 | require-extension as syntax |
| 57, 99, 131, 136, 150, 237, 240 | Records, ERR5RS Records, ERR5RS Record Syntax (reduced), Extensible record types, Hygienic ERR5RS Record Syntax (reduced), R6RS Records (refined), Reconciled Records | various | see Records |
| 60 | Integers as Bits | 2005-03-08 | bitwise-and bit-count and relatives as functions |
| 61 | A more general cond clause | 2005-07-21 | not coloured |
| 62 | S-expression comments | 2005-07-21 | #;, taken by R6RS and R7RS |
| 64 | A Scheme API for test suites | 2006-06-18 | not coloured |
| 66 | Octet Vectors | 2005-12-15 | not coloured |
| 69 | Basic hash tables | 2005-09-14 | its procedures as functions |
| 87 | => in case clauses | 2006-10-18 | => in case, taken by R7RS |
| 88 | Keyword objects | 2007-07-03 | the key: syntax as a literal |
| 95 | Sorting and Merging | 2007-01-29 | sort sort! merge sorted? |
| 97 | SRFI Libraries | 2008-12-22 | library names |
| 98 | An interface to access environment variables | 2008-09-19 | get-environment-variable, taken by R7RS |
| 105 | Curly-infix-expressions | 2012-11-06 | { } read as brackets |
| 111 | Boxes | 2013-07-03 | box unbox set-box! box? |
| 112 | Environment Inquiry | 2013-09-12 | not coloured |
| 115 | Scheme Regular Expressions | 2014-07-14 | not coloured |
| 125 | Intermediate hash tables | 2016-05-28 | the names it shares with SRFI 69 |
| 126 | R6RS-based hashtables | 2016-02-01 | not coloured |
| 128 | Comparators (reduced) | 2016-02-14 | not coloured |
| 132 | Sort Libraries | 2016-04-20 | list-sort vector-sort |
| 133 | Vector Library (R7RS-compatible) | 2016-03-20 | the procedures it shares with SRFI 43 |
| 141 | Integer division | 2016-12-14 | not coloured |
| 143, 144 | Fixnums; Flonums | 2017-05-27, 2017-07-17 | not coloured |
| 145 | Assumptions | 2017-03-31 | assume as syntax |
| 151 | Bitwise Operations | 2017-07-10 | not coloured, apart from names it shares with SRFI 60 |
| 158 | Generators and Accumulators | 2017-10-27 | not coloured |
| 160 | Homogeneous numeric vector libraries | 2019-08-27 | the vector prefixes |
| 163 | Enhanced array literals | 2019-01-18 | the #2a( prefix |
| 169 | Underscores in numbers | 2019-07-26 | not recognised |
| 181 | Custom ports (including transcoded ports) | 2020-09-08 | not coloured |
| 226 | Control Features | 2023-04-25 | not coloured |
| 248 | Minimal delimited continuations | 2025-01-24 | not coloured |
| 251 | Mixing groups of definitions with expressions within bodies | 2024-05-06 | no effect on colouring |
| 267 | Raw String Syntax | 2026-04-26 | not recognised |
The SRFIs withdrawn include 3, 12, 15, 20, 24, 32, 33, 40, 56, 76 and 83 (their titles: List-Set Library, Exception Handling, Syntax for dynamic scoping, Simple object system, Define-syntax in local lexical scopes, Sort Libraries, Integer Bitwise-operation Library, A Library of Streams, Binary I/O, R6RS Records, R6RS Library Syntax). Several of them have a later SRFI of the same title: 32 and 132 are both “Sort Libraries”, 142 (withdrawn) and 151 are both “Bitwise Operations”, and 40 (withdrawn) is the “Library of Streams” where 41 is “Streams”.
SRFIs and the reports
- R7RS-small – the report itself cites SRFI 9 (records), SRFI 45 (promises, in
delayanddelay-force), SRFI 1 (the early termination ofmapandfor-eachand the optional argument ofmemberandassoc), SRFI 6 (string ports) and SRFI 4 (the#u8spelling of bytevectors). The table above also marks as “taken by R7RS” SRFIs 11, 16, 23, 30, 34, 38, 39, 46, 62, 87 and 98, because the forms are the same as the report’s; the report does not name them, and that match is from memory. - R6RS – defined its own libraries rather than SRFIs; SRFI 97 names the SRFI libraries for it, and SRFI 83 (R6RS Library Syntax) and SRFI 76 (R6RS Records) were withdrawn.
- R7RS-large – the large language is made up of SRFIs and parts of others, gathered in numbered editions with colour names. The SRFI index marks which SRFIs belong to the Red edition and which to the Tangerine edition; among those it marks are 1 (list library), 14 (character sets), 41 (streams), 101 (random-access lists), 111 (boxes), 113 (sets and bags), 116 (immutable lists), 117 (list queues), 125 (hash tables), 127 (lazy sequences), 132 (sort), 133 (vectors), 134 (deques) and 135 (immutable texts) for the Red edition, and 115 (regular expressions), 141 (integer division), 143 and 144 (fixnums and flonums), 146 (mappings), 151 (bitwise operations), 158 (generators) and 160 (numeric vectors) for the Tangerine edition. The index may mark more than these; only the ones found are listed.
Support in implementations
Each implementation supports its own set of SRFIs, in its distribution or as an extension, and many report them through cond-expand feature identifiers such as srfi-1 (SRFI 0 describes the form; R7RS also allows (library (srfi 1))). Shiro Kawai’s Practical Scheme maintains a table of which implementation supports which SRFI, and Arvydas Silanskas’s index.scheme.org an index of implementations, standards and SRFIs; both are named on the SRFI index page itself.
Not described
Known, not yet covered
- Reference: only the SRFI index page was read; none of the SRFI documents was downloaded, so what each SRFI specifies is not described beyond its title, and the lists of procedures of SRFIs 1, 13, 43, 69 and 95 in this site come from memory.
- Reference: which SRFIs belong to R7RS-large was read from the keywords of the index, and only the ones listed above were found; the full lists of the Red and Tangerine editions are not described.
- Reference: the “taken by R7RS” notes in the table for SRFIs 11, 16, 23, 30, 34, 38, 39, 46, 62, 87 and 98, and “taken by R6RS” for 11, 16, 30 and 62, are from memory: the reports’ text that was read does not name those SRFIs.
See also
- Standard libraries – the libraries of the reports
- History and standards – R7RS-large
- Implementations and dialects – what each supports