Kawa, the Java-based Scheme system

Node:Features, Next:Getting Kawa, Previous:Top, Up:Top

## Features

Kawa is a full Scheme implementation. It implements almost all of R5RS (for exceptions see Restrictions), plus some extensions. By default, symbols are case sensitive.

It is completely written in Java. Scheme functions and files are automatically compiled into Java byte-codes. Kawa does some optimizations, and the compiled code runs at reasonable speed.

Kawa uses Unicode internally, and uses the Java facilities to convert files using other character encodings.

Kawa provides the usual read-eval-print loop, as well as batch modes.

Kawa provides a framework for implementing other progressing languages, and comes with incomplete support for CommonLisp, Emacs Lisp, and EcmaScript, and the draft XML Query language.

Kawa is written in an object-oriented style.

Kawa has builtin pretty-printer support, and fancy formatting.

Kawa supports class-definition facilities, and separately-compiled modules.

Kawa implements the full numeric tower, including infinite-precision rational numbers and complex numbers. It also supports "quantities" with units, such as `3cm`.

You can optionally declare the types of variables.

You can conveniently access Java objects, methods, fields, and classes.

Kawa implements most of the features of the expression language of DSSSL, the Scheme-derived ISO-standard Document Style Semantics and Specification Language for SGML. Of the core expression language, the only features missing are character properties, `external-procedure`, the time-relationed procedures, and character name escapes in string literals. Also, Kawa is not generally tail-recursive. From the full expression language, Kawa additionally is missing `format-number`, `format-number-list`, and language objects. Quantities, keyword values, and the expanded `lambda` form (with optional and keyword parameters) are supported.

Kawa implements the following semi-standard SRFIs (Scheme Request for Implementation):

- SRFI 0: Feature-based conditional expansion construct, using `cond-expand` - see Syntax and conditional compilation.
- SRFI 1: List Library, if `(require 'list-lib)`.
- SRFI 4: Homogeneous numeric vector datatypes - see Uniform vectors..
- SRFI 6: Basic String Ports - see Ports.
- SRFI 8: `receive`: Binding to multiple values - see Multiple values.
- SRFI 9: Defining Record Types, using `define-record-type` - see Record types.
- SRFI 11: Syntax for receiving multiple values, using `let-values` and `let*-value` - see Multiple values.
- SRFI 17: Generalized `set!` - see Locations.
- SRFI 23: Error reporting mechanism, using `error` - see Exceptions.
- SRFI 25: Multi-dimensional Array Primitives - see Arrays.
- SRFI 26: Notation for Specializing Parameters without Currying - see Procedures.
- SRFI 28: Basic Format Strings - see Format.
- SRFI 30: Nested Multi-line Comments.