リリース 0.9.4
Major feature upgrade
R7RSサポート
GaucheはR7RS-smallをサポートしました ( http://r7rs.org/ )。
特別なことをしないでも、R7RSのライブラリをロードしたり、R7RSのスクリプトを実行できます。
(若干、気をつけるべきことはあります。refj:標準への準拠参照)。
R7RSがどのように統合されているかの詳細については
refj:ライブラリモジュール - R7RS統合を見てください。
これまでのGaucheコードとの互換性は最大限に保たれています。基本的に、
今までのGaucheコードはそのまま走りますし、新たに書くコードも
今まで通りで大丈夫です。
今までと同じように書くか、R7RS風に書くかは自由です。ポータブルなコードに
する予定ならR7RS風にするのが良いでしょう。Gauche特有のライブラリに
深く依存したコードなら、他の処理系では走らないでしょうから、R7RSに
こだわる必要はないでしょう。
主要な改善点
- REPLが少し良くなりました。ヒストリにアクセスできます(refj:REPLでの開発)。
describeをシンボルに対して呼ぶと知られている束縛が表示されます。
デフォルトの表示は、共有構造を明示しないようになりました。初心者がしばしば
混乱するからです。循環構造は依然としてsrfi:38表記で表示されます。
- data.random: ランダムデータジェネレータのモジュールです。
- math.prime: 素数の遅延シーケンス、素数テスト、
そして素因数分解を行うモジュールです。
- srfi-106: 基本的なソケットインタフェースです。
- PIPEシグナルの処理が変更されました。デフォルトでは、Gaucheは実質的に
SIGPIPE
を無視します。SIGPIPE
が生じたであろうシステムコールは、
EPIPE
システムエラーを投げます。
シグナルが届くタイミングがScheme界とC界で違うため、
SIGPIPE
をSchemeレベルでうまく処理するのは難しく、
むしろEPIPE
システムエラーを捕まえる方が簡単だからです。
なお、stdout
とstderr
への書き込みで発生したEPIPE
は
プロセスを即座に終了させます。これは、Gaucheスクリプトをパイプの途中で
使っていて、パイプの先のプロセスが突然終了した場合にごちゃごちゃエラーメッセージを
出さないためです。詳しくはrefj:シグナルの処理を参照してください。
- writeとdisplayはR7RS準拠になりました。
つまり、循環構造が渡されても爆発しません。
- Windowsにおいて、システムインタフェースは、
ファイル名、コマンドライン引数、環境変数などに渡されたマルチバイト文字列を
正しく処理できるようになりました。SAITO Atsushiに感謝。
- gauche.configure: Gauche拡張モジュールのビルドを
autoconfシステムから置き換えるためのモジュール
- 新しい文字列補間構文:
#`"foo ,x"
に代わり #"foo ~x"
が使えます。
詳しくは refj:文字列の補間を。
新たな手続きや改善点いろいろ
- 新たな数値演算手続き
- 有理数化:
rationalize,
real->rational,
continued-fraction;
Gauche-blog:20120925-rationalizeを参照。
おまけとして、浮動小数点数を正確数に直した時に、より読みやすい(簡単な)
有理数になります。Gauche-blog:20120930-exact参照。
- 整数演算:
exact-integer? (r7rs)
expt-mod,
twos-exponent, twos-exponent-factor,
- ガンマ関数:
gamma, lgamma.
- r7rs除算:
floor/, floor-quotient,
floor-remainder,
truncate/, truncate-quotient,
truncate-remainder.
- exptは、指数が非整数であっても正確な有理数の場合、
可能であれば正確な結果を返します。
- リストとベクタの手続き:
length<=?, list-set!,
vector-map (r7rs), vector-for-each (r7rs),
vector-tabulate.
- 新たな正規表現手続き:
rxmatch-substrings,
rxmatch-positions, rxmatch-named-groups.
- また、正規表現オブジェクトはread/write invaliantとなりました。
- rfc.json:
jsonの配列およびオブジェクトと、Schemeオブジェクト間のマッピングをカスタマイズ
できるようになりました。また、一つのソースから複数のjsonオブジェクトを読み出すための
parse-json*が追加されました。
- gauche.generator: 新しい手続き:
gconcatenate,
gmerge, gbuffer-filter.
- gauche.lazy: 新しい手続き:
lconcatenate
- gauche.uvector:
- rfc.http: basic認証のサポート追加。
- file.filter:
file-filterは、
:leave-unchanged
オプションで、ファイルの内容に変更がない場合に
元のファイルを変更しないように指定できます。
新たな手続き:
file-filter-for-each,
file-filter-fold,
file-filter-map.
- 通常ファイル以外の、例えばデバイスファイルなどもスクリプトに指定できます。
例えばワンライナーで次のように使えます:
gosh -E... /dev/null
.
- 文字セットをコレクションフレームワークに適合させ、また
適用可能オブジェクトとしました。
- トライ (util.trie) を辞書フレームワークに適合させました。
- make-tree-mapは
二つの引数
=
と<
のかわりに、一つのcompare
引数をとることもできます。
- rfc.hmac:
ダイジェストアルゴリズムのメタクラスに応じて適切なブロックサイズを選択します。
- string-split:
オプショナル引数で、最高いくつまで文字列を分割するか指定できます。
Perlのオペレータ等に似た機能があります。
- command-line (r7rs)
- include、include-ci (r7rs)
- util.sparse: sparse-vector-ref
と sparse-table-ref に一般化されたセッターを追加。
- symbol=?, boolean=? (r7rs).
- リーダーはR7RSの
#true
と #false
を認識します。
- 負のゼロ (
-0.0
) は、それが違いを生む箇所では判別されます。
- generator-find
- cond-expandに
library
節のサポート追加 (r7rs).
- text.unicode: utf8->string,
string->utf8 (r7rs);
string-ci=? etc. はR7RSに要求されるように、
Unicodeのフルケースマッピングを行います。
- dotimesとdolistで、変数を省略できます。
- letrec* (r7rs).
- rfc.base64: base64-decode
とbase64-encodeに
:url-safe
キーワード引数
追加。url-safeな文字セットを使うことができます。
- syntax-rules: r7rsでの拡張をサポート。
- define-values: r7rsに仕様を合わせました。
- sys-errno->symbol, sys-symbol->errno.
- 組み込みのソート手続きでsrfi-95をサポート。
refj:比較とソート参照。
- digit->integer, integer->digit:
[0-9]
以外の数字も処理できるように拡張。Unicodeでは「数字」が何種類も
定義されています。
- gauche.dictionary: bimapに、
デフォルトの衝突解決ポリシーを指定できるように。
- os.windows: コンソール関係の手続きが増えました。
github.com/Hamayamaに感謝。
山ほどのバグフィクス
互換性に影響を与える修正
- リーダ構文
\xNN
はデフォルトでR7RS式に解釈されます
(セミコロンで終端されるUnicodeコードポイント)。
終端のセミコロンが無い場合は、古い構文で解釈を試みます。
しかし、曖昧な場合があり、以前と動作が異なる可能性があります。
リーダモードをreader-lexical-modeで変更すれば、
以前のバージョンと完全互換にできます。
- 文字セットのハッシュ関数が良くないものだったので変更しました。
もし以前のGaucheで計算した文字セットのハッシュ値を保存しているのであれば、
再計算する必要があります。
- 正確数を正確なゼロで割った場合。これまでは不正確な演算へと暗黙の変換を
行い
+inf.0
を返していましたが、R6RSからそれが許されなくなったため、
今はエラーを投げます。
- NUL文字を含む文字列を、文字列を期待する外部ライブラリに渡すとエラーになります。
例えば
"foo.scm\0.exe"
をopen-input-file
に渡す、といった
場合です。これを許すと、セキュリティ上の問題が生じる可能性があります。
0のバイトを含むバイナリ配列を外部ライブラリに渡したい場合は
u8vector
を使ってください。
- copy-bit-field: 引数の順序が変更されました。
Gaucheは昔のSLIBインタフェースに従っていたのですが、SRFI-60の制定過程で
引数順が変更されました。他との互換性のため、新しい仕様に従うようにしました。
この手続きを使っている以前のコードは変更の必要があります。
- rfc.uri: RFC3986の勧めに従い、
パーセントエンコーディングに大文字の
A-F
を使うようになりました。
パーセントエンコーディングが大文字か小文字かに依存しているコードは気をつけてください。
- srfi-13:
string-filterとstring-deleteの
引数順を変更しました。Gaucheはsrfiの決定時の仕様で実装したのですが、
これらの手続きの仕様はsrfiの決定後に、参照実装に合うように
変更されていました。(通常は参照実装の方をsrfiの文面に合わせるのですが、
このsrfiの場合、多くのScheme実装が参照実装を採用していたので、
参照実装の変更は難しかったのです)。幸い、どちらの引数順もサポートできるので、
以前のコードはそのまま動きつづけますが、出来れば新しい引数順に
合わせるようにしてください。
その他の主な修正
Last modified : 2014/07/25 01:11:50 UTC