Chicanery: subtle, opinionated improvements to R7RS Scheme
While I was reading the R7RS specification, I was a little annoyed by how broken up the standard library seemed to be. While the most egregious example is maybe (scheme case-lambda)
, which exports … only case-lambda
, the other libraries like (scheme write)
for display
, (scheme cxr)
for functions like caddr
but not cddr
, and the rest didn’t really seem logical to me. Plus, in CHICKEN scheme, the one I usually use, utf8
is an egg you need to install separately…
To ameliorate these minor warts in what I otherwise consider to be an excellent language, chicanery
was born. It’s kind of like a prelude, I suppose? It imports all r7rs
modules and re-exports their identifiers, and makes sure the implementation is Unicode-aware. It also includes a few extras ;)
Chicanery extras
I also thought it was strange that map
, for-each
, and append
apply to lists only, while vector-map
and string-for-each
, exist, for example. chicanery
prefixes the default map
, for-each
, and append
functions with list-
, and redefines those identifiers to functions that are generic over Scheme’s base collection types (lists, strings, vectors, bytevectors where applicable). I didn’t make the functions fully-generic to keep them efficient and because I don’t know how to do that, but you can still use vector-append
or list-map
if you know what type you need and want speed.
In a similar vein, I’ve also added generic functions ref
and copy
that dispatch to string-ref
, list-copy
, and the like.
Other extras include
(atom? x)
determines whetherx
is an atom (i.e., not a pair or null)(read-port)
,(read-port port)
reads a port until hitting end-of-file (IDK why this isn’t in R7RS!), in chunks ofread-port-chunk-size
(defined? x)
returns whether the symbolx
is bound to a variable(with-input-from-string str thunk)
callsthunk
withstr
bound as the current-input-port.(with-output-to-string thunk)
callsthunk
and returns a string of the output.(displayed x)
,(->string x)
returnsx
as a string (viadisplay
)(written x)
returnsx
as a string (viawrite
)(print x ...)
displaysx ...
followed by a newline
Supported Scheme implementations
chicanery
now supports multiple R7RS implementations! The full list can be found by running make
, but here’s what we have right now:
Chicken
Guile
Gambit
Other Scheme implementations have been minimally tested and I haven’t been able to figure them out yet. However, Cyclone is definitively not compatible; see issue #413.
License
This software is licensed under the GWL, v. 1.0. See COPYING for details.