Mosh 0.0.6 をリリースしました。
R6RS のエラーシステムの多くが実装され、より柔軟にエラー処理が書けるようになりました。
例えば (car 3) のようにエラーが発生しそうな場合、guard で囲むことにより
(import (rnrs))(guard
[con
[(message-condition? con)
(display (condition-message con))]]
(car 3))
例外をキャッチすることができます。
また guard で囲まない場合はデフォルトの例外ハンドラにより以下のようなエラーが表示されます。
Exception:
Unhandled exceptionCondition components:
1. &assertion
2. &who: car3. &message: "pair required"
4. &irritants: (3)
また本リリースでR6RSが要求する Hashtables、Conditions、Enumerations、List utilities 多くの機能が実装されました。
追加、変更点の詳細は以下の通りです。
R6RS モードの速度向上
「R6RS モード(-b オプション)」の起動が大幅に速くなりました。
R6RS Hastables
ハッシュテーブルを利用するための手続きがすべて実装されました。
使用例
(import (rnrs))(let ([hashtable (make-eq-hashtable)])
(hashtable-set! hashtable 'red 'apple)
(display (hashtable-ref hashtable 'red)));; => apple
R6RS Hastables では equivalence function と hash function を自分で定義し独自のハッシュテーブルを作成することもできます。
詳細な仕様はR6RS 13.Hashtablesをご覧ください。
R6RS Records
以下のように構造体を利用することができます。
(import (rnrs))(define-record-type (point make-point point?)
(fields (mutable x)(immutable y)))
(let ([p (make-point 3 4)])
(display (point-x p))) ; => 3
構造体は継承をすることもできます。詳細な使い方は6.Recordsをご覧ください。
R6RS Exceptions and conditions
例外とコンディションの仕組みが実装されました。
これにより
- 例外を発生させる
- 発生した例外の状況(コンディション)を示す
- 例外をキャッチしたり、そのまま実行を継続する
といったことが安全に行えるようになりました。
詳細な使い方は7.Exceptions and conditionsをご覧下さい。
細かい追加・内部的な改善など
- VM 内部で発生したエラーを全て新しいエラーシステムに入れ替え
- R6RS List Utilities のすべての機能を実装
- R6RS Enumerations のすべての機能を実装
- オープンソースで公開されている r6rs-test-suite に対応。以下のテストが通っています。
- mutable-strings.sps
- mutable-pairs.sps
- contrib.sps
- programs.sps
- control.sps
- hashtables.sps
- records/procedural.sps
- lists.sps
- enums.sps
- equal? が循環参照しているリストでも停止するように
- dynamic-wind を実装
- ライブラリプリコンパイルの速度改善
- g++ への負荷がだいぶ減りました
- psyntax の静的リンク
- parameterize のサポート
- call/cc が多値に対応してなかったバグを修正
- apply の速度向上
- IRIE Shinsuke さんによる READ_CHAR のパッチの取り込み
- IRIE Shinsuke さんによる grass.scm のパッチの取り込み
謝辞
今回のリリースまでに多くの方のアドバイス、不具合報告をいただきました。
みなさんありがとうございました。
不具合報告
不具合報告までお願いします。
もし面倒であれば、ここのコメント欄に書いていただくのでもかまいません。