Software: Shoe - a Scheme driver
Fredrik Noring

Shoe is a Scheme driver written by Fredrik Noring. It aims towards compliance. Many features are implemented, as well as a few extensions.

How can I get it?

Shoe can be fetched in two basic ways:

Shoe has been successfully compiled on the following operating systems: AIX 4.2, Digital Unix 4.0, Freebsd 3.2, HPUX 10.20, Irix 6.3, Linux Debian, Linux Redhat 6.0 and Solaris 2.5.1/2.6/7.

Shoe is distributed under the GNU General Public License.

What is Scheme? Scheme is a statically scoped and properly tail-recursive dialect of the Lisp programming language. It was designed to have an exceptionally clear and simple semantics. A wide variety of programming paradigms, including imperative, functional, and message passing styles, find convenient expression in Scheme.

What is ? is the ``Revised5 Report on the Algorithmic Language Scheme'' which describes the Scheme language.

How does it compare to Shoe? Shoe implements a large portion of . There are also a few additions:

  • Unicode, UTF8 and wide-strings are supported (very crudely so far).
  • Arbitrary precision integers are supported if GMP GMP is installed.
  • Vectors (and mappings) do not have to quoted, and unlike Guile, they are not implicitly quoted. Instead all values in a vector (and a mapping respectively) are evaluated. Example: #((+ 1 2 3 4) 42 'foo) ---> #(10 42 foo)
  • A new datatype called mapping. It behaves almost lika vectors, except that you may reference it using other types than integers. Mappings are in many cases almost as fast as vectors. Syntax: %(key1 : value2 key2 : value2 key3 : value3 ...) Subset of operations (similar to vectors): mapping-ref, mapping-set! mapping-remove!, mapping-length, mapping->list, list->mapping, mapping?, mapping-keys, mapping-values, mapping-copy


    (define m %("flowers" : '(hepatica tulip) "planets" : '#(mercury venus earth) 'shoe : "Shoe is a Scheme driver" 4711 : "some value")) (mapping-ref m "flowers") ---> (hepatica lily) (mapping-ref m 4711) ---> "some value" (mapping-set! m 4711 42) (mapping-ref m 4711) ---> 42 (mapping-ref m "fruits") ---> #f (mapping-remove! m "flowers") (mapping-ref m "flowers") ---> #f m ---> %("planets" : #(mercury venus earth) 'shoe : "Shoe is a Scheme driver" 4711 : 42)

Some parts of will probably not be implemented:

  • Dynamic-wind is not supported.
  • Identifiers are case sensitive.
  • Strings are always immutable, e.i. `string-set!' and `string-fill!' are replaced with their non-destructive variants represented by `string-set' and `string-fill' respectively--both which return a newly allocated string.

Other technical details

  • The compiler is, almost, two-pass.
  • Strings and symbols are shared.
  • Eval compiles its expression before evaluating it.
  • Mappings are self-resizable, i.e. you don't have to worry about them being too small or too big.
  • The number notation of is supported and exceeded. You can for example type a binary float like `#b10.11e10'.
  • Exceptions using throw and catch are implemented.
  • The memory is managed using a combined mark-and-sweep and stop-and-copy garbage collector. The heap can both grow and shrink as needed.