リリース 0.9.10


メジャーな機能拡張リリース

新たな機能

R7RS LargeとSRFIのサポート

R7RS largeのRedとTangerineエディションをカバーしています。

新モジュール

改善

文字列インデクシングの改善

Gaucheでは文字列をマルチバイト形式で持っているので、デフォルトではn文字目に直接 アクセスするのにO(n)の時間コストがかかります。これをO(1)にする二つの改善が入りました。

註:Gaucheではいくつかの文字列操作を効率よく実装するために、文字列ポインタというのを 内部で使っていました。文字列カーソルがその目的に使えるようになったので、 文字列ポインタはサポートされなくなりました。これまでもドキュメントされていませんでしたが、 もし文字列ポインタを使っているコードがあったら、 環境変数GAUCHE_STRING_POINTERを定義することで使いつづけることができます。 ただし、次のリリースでは完全に除外します。

変更不可なペア

Schemeではリテラルのペアは変更不可であると規定されていますが、それを検査するかどうかは 実装任せです。Gaucheはこれまでチェックをしておらず、リテラルペアを変更してしまうことが 可能でした。このリリースから、変更不可なペアが導入され、リテラルペアの変更は エラーとなります。リテラルペアを変更することは意味的に不正であり、 もしそのエラーが出たなら、そうしているコードのバグが顕在化したということです。

変更不可なペアはscheme.ilistモジュールの手続きを使って 明示的に作ることもできます。Gaucheでは変更不可なペアは、変更しようとしたときに エラーになる以外は、変更可能なペアと全く同様に振る舞います。 詳しくはMutable%20and%20immutable%20pairsを見てください。

もし以前の振る舞いに依存しているコードがありすぐに変えられない場合は、 環境変数GAUCHE_MUTABLE_LITERALSをセットすると以前と同じ振る舞いになります。

入力編集

REPLでの入力編集機能が、オンラインヘルプも含めかなり拡張されました。 M-h h で簡単な編集機能のサマリが出ます。

編集機能はまだデフォルトではoffですが、環境変数GAUCHE_READ_EDITだけでなく コマンドライン引数-fread-editでもonにすることができます。

パラメータが組み込みに

パラメータをR7RSの範囲内の機能で使う場合は、(use gauche.parameter)は要りません。 このモジュールはあまり使われないパラメータの機能を提供するために残してあります。

ビットベクタリテラルと不完全文字列リテラル

ビットベクタが組み込みでサポートされるようになりました。 ところが、ビットベクタリテラルと不完全文字列リテラルで構文に曖昧性が生じる ことが判明しました。そこでこのバージョンから、不完全文字列リテラルは文字列の前に #** を付加するように変更されています。曖昧でない限りは 以前の構文も読まれます。Incomplete%20strings参照。

ポートのC APIの改訂

これはCコードからScmPortを使っている場合のみ影響があります。 将来の柔軟な拡張を許すため、ScmPortの内部実装を隠すようにしました。 ScmPortへのアクセスをAPIを通じて行っている限り、ユーザコードに変更は必要ありませんが、 ScmPortのメンバに直接アクセスしている場合はAPIを使うように書き直す必要があります。

ひとつ注意すべき変更は、ポート位置が整数オフセットとは限らなくなったことです。

TLSサポートの改善

文字コード変換の改善

従来の日本語文字コードエンコーディング間の変換に加え、 UTF (8, 16, 32)、ISO8859-nの変換も組み込みで行うようになりました。 それ以外のエンコーディングと変換する時のみ、iconv(3)が使われます。

これは、srfi-181 transcoded portをサポートするのに必要なAPIが iconvでは提供されないためです。文字コード変換が必要なだけなら、 従来どおりgauche.charconvを使えば、iconvがサポートする全ての エンコーディングがサポートされます。srfi-181を使って変換する場合は、 Gaucheが組み込みでサポートしているエンコーディング間の変換に限られます。

必要があれば、組み込みでサポートするエンコーディングを増やしてゆくかもしれません。

その他の改善

バグフィクス


Last modified : 2020/12/11 23:08:25 UTC