Frequently Asked Questions

What is the equivalent of Java import?

Kawa’s import follows R6RS, so it is bit like Java’s import static TypeName.* (static-import-on-demand) declaration.

Kawa doesn’t have a direct equivalent of Java’s import TypeName (single-type-import) declaration, but define-alias provides similar functionality:

(define-alias StrBuf java.lang.StringBuffer)

This has the advantage that you can pick an arbitrary name as an alias.

There is no direct equivalent to Java’s import PackageOrTypeName.* (type-import-on-demand) declaration, but you can alias a package:

(define-alias jutil java.util)
(define mylist :: jutil:List (jutil:ArrayList))

You can also use define-namespace to introduce an abbreviation or renaming of a class name, but as a matter of style define-alias is preferred.

How do I refer to a Java member (nested) class?

Consider the Java SE member class javax.swing.text.AbstractDocument.Content. Using the Java syntax doesn’t work in Kawa. Inside you should use Kawa’s colon operator:

javax.swing.text.AbstractDocument:Content

Alternatively, you can use the internal JVM class name:

javax.swing.text.AbstractDocument$Content

Why does Kawa’s REPL use display rather than write?

The read-eval-print-loop of most Scheme implementations prints the evaluation result using write, while Kawa uses display by default.

First note that it is easy to override the default with the --output-format command-line option:

$kawa --output-format readable-scheme
#|kawa:1|# "abc"
"abc"

The reason display is the default is because of a vision of the REPL console as more than just printing out Scheme objects in textual form for use by a programmer. Some examples:

This "repl-as-pad" model doesn’t work as well if the repl uses write rather than display.