メジャーな機能拡張リリース
R7RS largeのRedとTangerineエディションをカバーしています。
srfi-101
: 純粋に関数的なランダムアクセスペアとリスト (scheme.rlist)
srfi-116
: 変更不可なリストのライブラリ (scheme.ilist)
srfi-135
: 変更不可なテキスト (scheme.text)
srfi-159
: コンビネータフォーマッタ (scheme.show)
srfi-176
: バージョンフラグ。組み込みです。 (version-alist)
srfi-195
: 多値ボックス (ボックス).
Gaucheでは文字列をマルチバイト形式で持っているので、デフォルトではn文字目に直接 アクセスするのにO(n)の時間コストがかかります。これをO(1)にする二つの改善が入りました。
scheme.text
ライブラリで規定されました
(text
型というのを導入しています)。Gaucheではtext型は単に
補助インデックスが計算された文字列ということになります。
詳しくは文字列索引を見てください。
註:Gaucheではいくつかの文字列操作を効率よく実装するために、文字列ポインタというのを
内部で使っていました。文字列カーソルがその目的に使えるようになったので、
文字列ポインタはサポートされなくなりました。これまでもドキュメントされていませんでしたが、
もし文字列ポインタを使っているコードがあったら、
環境変数GAUCHE_STRING_POINTER
を定義することで使いつづけることができます。
ただし、次のリリースでは完全に除外します。
Schemeではリテラルのペアは変更不可であると規定されていますが、それを検査するかどうかは 実装任せです。Gaucheはこれまでチェックをしておらず、リテラルペアを変更してしまうことが 可能でした。このリリースから、変更不可なペアが導入され、リテラルペアの変更は エラーとなります。リテラルペアを変更することは意味的に不正であり、 もしそのエラーが出たなら、そうしているコードのバグが顕在化したということです。
変更不可なペアはscheme.ilistモジュールの手続きを使って 明示的に作ることもできます。Gaucheでは変更不可なペアは、変更しようとしたときに エラーになる以外は、変更可能なペアと全く同様に振る舞います。 詳しくは変更可能なペアと変更不可なペアを見てください。
もし以前の振る舞いに依存しているコードがありすぐに変えられない場合は、
環境変数GAUCHE_MUTABLE_LITERALS
をセットすると以前と同じ振る舞いになります。
REPLでの入力編集機能が、オンラインヘルプも含めかなり拡張されました。
M-h h
で簡単な編集機能のサマリが出ます。
編集機能はまだデフォルトではoffですが、環境変数GAUCHE_READ_EDIT
だけでなく
コマンドライン引数-fread-edit
でもonにすることができます。
パラメータをR7RSの範囲内の機能で使う場合は、(use gauche.parameter)
は要りません。
このモジュールはあまり使われないパラメータの機能を提供するために残してあります。
ビットベクタが組み込みでサポートされるようになりました。
ところが、ビットベクタリテラルと不完全文字列リテラルで構文に曖昧性が生じる
ことが判明しました。そこでこのバージョンから、不完全文字列リテラルは文字列の前に
#**
を付加するように変更されています。曖昧でない限りは
以前の構文も読まれます。不完全文字列参照。
これはCコードからScmPortを使っている場合のみ影響があります。 将来の柔軟な拡張を許すため、ScmPortの内部実装を隠すようにしました。 ScmPortへのアクセスをAPIを通じて行っている限り、ユーザコードに変更は必要ありませんが、 ScmPortのメンバに直接アクセスしている場合はAPIを使うように書き直す必要があります。
ひとつ注意すべき変更は、ポート位置が整数オフセットとは限らなくなったことです。
<mbed-tls>
がデフォルトのTLS実装として使われます。
<ax-tls>
は常に使えるんですが、サイファーのサポートが限られていて、
接続できないhttpsサイトがありました。
従来の日本語文字コードエンコーディング間の変換に加え、
UTF (8, 16, 32)、ISO8859-nの変換も組み込みで行うようになりました。
それ以外のエンコーディングと変換する時のみ、iconv(3)
が使われます。
これは、srfi-181
transcoded portをサポートするのに必要なAPIが
iconv
では提供されないためです。文字コード変換が必要なだけなら、
従来どおりgauche.charconv
を使えば、iconv
がサポートする全ての
エンコーディングがサポートされます。srfi-181
を使って変換する場合は、
Gaucheが組み込みでサポートしているエンコーディング間の変換に限られます。
必要があれば、組み込みでサポートするエンコーディングを増やしてゆくかもしれません。
~f
が複素数にも対応。
また、新たなフォーマット指示子の追加: ~t
,
,
~~
, ~|
, ~$
.
replace
も取れるようになりました。
これは不正なunicodeシーケンスをU+FFFD
"に置換します。
utf8->string も、不正な文字をエラーではなく置換文字におきかえる
ようになりました。
add-bom?
引数の追加。
#t
を
返すようになりました。ERマクロシステムでは、識別子が裸のシンボルであることもあるためです。
オブジェクトが包まれた識別子でありシンボルでないことを調べるには
wrapped-identifier?が使えます。
gosh
を-frest
オプションを使ってビルドツリーの中で走らせる場合、
LD_LIBRARY_PATH
の設定にかかわらず、ビルドツリーの
libgauche.so
をリンクするようになりました。 ( https://github.com/shirok/Gauche/pull/557
)
apropos
がシンボルに加え文字列も受け付けるようになりました ( https://github.com/shirok/Gauche/pull/555 )
default-hash
でハッシュ可能に。
.dir-locals.el
を置きました。Emacsで編集する際に、
Gauche特有のインデント方式などを自動設定します。
gosh
がsuid/sgidプロセスとして走った場合、.gaucherc
ファイルを
ロードせず、またヒストリファイルをロード/セーブしないようにしました。
gauche.listener
からコアに移動。
default-exactness
オプショナル引数を
追加。入力に明示的な正確/非正確指定が無い場合に、どちらと解釈するかの指定。
gauche-package generate
がSchemeだけのパッケージのボイラープレートも
生成できるように。
:collection
qualifierで
任意のコレクションをジェネレータとして使えるようになりました。
<time>
オブジェクトも取れるように。
nice()
へのインタフェース追加。
eq?
かeqv?
の
場合、等価器のハッシュ関数は無視して、それぞれeq-hash
/eqv-hash
を使うように
なりました。これはsrfi-125で許されている動作で、ハッシュ関数を持たないオブジェクトを
eq/eqvハッシュテーブルに格納できるようになります。
( https://github.com/shirok/Gauche/issues/708 ).
:error
キーワード引数に :merge
を指定すると
run-process
がstderrをstdoutにマージします。
gosh
: -e
オプションが複数の式を受け付けるように。
<stacked-map>
追加。
:not
擬似クラスのレンダリングのfix ( https://github.com/shirok/Gauche/pull/645 ), およびan+b
構文のサポート追加
( https://github.com/shirok/Gauche/pull/648 ).
:encoding
キーワード引数を認識するように ( https://github.com/shirok/Gauche/issues/651 ).
apply
に循環リストを渡した場合に、無限ループに入らずエラーを投げるように。
copy-list
に循環リストを渡した場合に、無限ループに入らずエラーを投げるように。
()
としました。
and-let*
はボディが空でも使うことができます。
undefined
手続きへの参照を
非衛生的に挿入するバグがあり、gauche
モジュールを継承しないR7RSコードで
エラーが出ていました。