Release 0.9.10

Major feature enhancements

New Features

R7RS Large and SRFI support

We cover R7RS-large Red and Tangerine Edition.

New modules


String indexing improvements

In Gauche, string access using integer character index costs O(n) by default, because we store strings in multibyte format. Two improvements are incorporated to allow O(1) random string access.

Note: Gauche internally had string pointers to implement some string operations efficiently. Now string cursors can be used for that purpose, we dropped string pointers. If you have code that uses string pointers, although it was undocumented, you can keep using it by defining GAUCHE_STRING_POINTER environment variable. We'll completely drop it in the next release, though.

Immutable pairs

Scheme defines literal pairs to be immutable, but it is up to the implementation to check it. Gauche used to not check it, allowing mutating literal pairs. Now it is no longer allowed--it throws an error. Mutating literal pairs is never correct, and if you get the error, you've been doing it wrong.

Immutable pairs can also be explicitly constructed using scheme.ilist module. In Gauche, immutable pairs and lists behaves exactly like normal pairs and lists, except that they can't be modified. See Mutable%20and%20immutable%20pairs, for the details.

If your code depends on the previous behavior and can't change swiftly, set the environment variable GAUCHE_MUTABLE_LITERALS to restore the old behavior.

Input line editing

The editor feature is enhanced a lot, including online help. Type M-h h to get a quick cheet sheet.

The line editor isn't turn on by default yet, but you can either turn on with the command-line option -fread-edit or the environment variable GAUCHE_READ_EDIT.

Parameters are now built-in

You no longer need to (use gauche.parameter) to use parameters as defined in R7RS. The module still exists and provides a few obscure features.

Bitvector literal and incomplete string literals

We now supports bitvector type in the core. Note that there's a syntax conflict with bitvector literals and incomplete strings; now the official way of incomplete string literal is to prefix a string with #**. The older syntax is still recognized as far as it's not ambiguous. See Incomplete%20strings.

The C-level Port API is overhauled

This only affects for C code using ScmPort. To support future extensions flexibly, we hide the internal implementation of ScmPort. It shouldn't affect code that accesses ScmPort via API, but if the code directly refers to the members of ScmPort, it should be rewritten to use API.

One notable change is that port positions no longer need to be an integer offset.

TLS support improvement

Encoding conversion improvement

Now we support conversion natively, between UTF (8, 16, 32) and ISO8859-n, as well as between Japanese encodings. We use iconv(3) only when we need to deal with other encodings.

This is because iconv lacks a necessary API to support srfi-181 transcoded ports properly. If you just need to convert encodings, you can keep using gauche.charconv and it handles wide variety of encodings supported by iconv. If you use srfi-181, the conversion is limited between the natively supported encodings.

We may enhance native support of conversions if there's need for it.

Miscellaneous improvements

Bug fixes

Last modified : 2020/12/11 11:30:28 UTC