R5RS Pitfalls Test Results
This test suite was created for SISC to test R5RS compliance in edge
cases of the standard that are often overlooked or tricky to implement
correctly. The tests are, for the most part, collections of
expressions from the comp.lang.scheme newsgroup from discussions of
consequences of the R5RS standard, bugs in the standard's
implementation of derived expressions, and bugs found in other Scheme
systems. The source of the test is r5rs_pitfall.scm.
Below are the results of Scheme systems I have access to and which at least claim to support most of the R5RS standard.
System | 1.1 | 1.2 | 1.3 | 2.1 | 3.1 | 3.2 | 3.3 | 4.1 | 4.2 | 5.1 | 5.2 | 5.3 | 6.1 | 7.1 | 7.2 | 7.3 | 7.4 | 8.1 | Map |
Bigloo 2.5c | F | F | P | F | F | P | P | F | F | P | P | P | P | P | P | P | P | F | |
Chez 6.9 | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | call/cc |
Chicken 1.0 | Fn | Fn | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | call/cc |
Gauche 0.6.6 | F | F | P | P | P | P | ? | P | P | P | P | P | P | P | P | P | F | ? | |
Kawa 1.6.99 | F | F | F | F | P | P | P | P | P | P | P | P | P | F | F | F | F | P | F |
Larceny (*) | F | P | F | P | P | F | P | P | P | P | P | P | P | P | P | P | P | P | call/cc |
MIT-Scheme 7.7.1 | F | F | P | P | P | P | P | P | P | F | F | F | P | P | P | P | P | P | |
MzScheme 203 | F | F | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | |
Scheme48 1.2 | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | call/cc |
SCM 5d7 | P | P | P | F | P | P | P | P | P | P | P | P | P | P | P | P | P | P | |
SISC 1.7.3 | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | P | call/cc, tr |
Key: Pass, Fail, ?=results unavailable, call/cc=System's map isn't affected by call/cc. tr=map is tail recursive.
Notes
- Chicken 1.0 passes tests 1.1 and 1.2 if provided with a commandline switch (--strict-letrec) to generate R5RS compliant code from letrecs.
- (*) Larceny version not officially released but available for download at http://www.ccs.neu.edu/home/lth/thesis/index.html.
Jeff Siskind points out that its possible to be both call/cc and
tail recursive, but the example he cites uses reverse after processing
the list. So map can be:
- Tail-recursive
- Resistant to call/cc interference
- O(1*n)
Pick two. In the above table, we've noted when a system is resistant to call/cc effects, and labeled systems that we know are tail recursive because the implementor has said so. Others in the list may be tail recursive.
Systems claiming R5RS compliance not tested were OpenScheme and Rhizome/pi, due to not having a compatible OS handy to run them on.