# Features

Runs on the Java platform, with no native code needed.

Extends the Scheme language, following the R7RS specification from 2013. Scheme has many implementations, and is much used in research and teaching.

Programs run fast - roughly as fast as Java programs, and much faster than other “scripting languages”. This is due to a sophisticated compiler, compile-time transformations, type inference, and optional type declarations.

Full, convenient, and efficient access to the huge set of Java libraries means you can access objects, methods, fields, and classes without run-time overhead.

Start-up times are fast. You don’t have to wait for a lot of initialization. Even if you start with source code, the parser and compiler are fast.

Scripts are simple Kawa source files that can run as an application or command. These are simple to write, start, and run efficiently, since they’re automatically compiled before execution.

Alternatively, you can embed Kawa as a scripting language for Java applications.

Deployment is easy and flexible. You just need the Kawa jar file.

Macros and custom named literals make it easy to extend the syntax and implement Domain-Specific Languages.

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

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

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

You can allocate and initialize objects with a compact “builder” syntax. It works out-of-the-box (with no run-time overhead) on many classes and APIs, but can be customized if need be.

A library for functional composable pictures lets you create “picture” objects, display them, transform them, combine them, convert to SVG or images, and more. This can be “printed” directly in the Kawa console (either the DomTerm console or the Swing one).

JavaFX programming is simpler.

You can run Kawa programs on Android, and there is special handling to make constructing View objects easier.

Flexible shell-like functionality, including process literals.

Web page scripts are easy to write and install with self-configuring web servers, optionally using servlets and XML literals.

Arrays and sequences have a lot of flexibility: Arrays can be multi-dimensional; you can use an array as an index (which generalizes slices and permutations); you can define a lazy array using a function that maps indexes to values; you can re-map the indexes to yield a transformed array.

Many useful features for mathematics and numerics:

- The full “numeric tower” includes infinite-precision rational numbers and complex numbers.

- Compile-time optimization of arithmetic with the use of type declarations and inference.

- A quantity is a real number with a unit, such as `3cm`.

- Quaternions are a 4-dimensional generalization of complex numbers. Unsigned primitive integer types (`ubyte`, `ushort`, `uint`, `ulong`) are implemented efficiently without object allocation.

A lazy value wraps an expression which is evaluated only when it is needed.

Kawa provides a framework for implementing other programming languages, and comes with incomplete support for CommonLisp, Emacs Lisp, and EcmaScript, and XQuery.