週刊mosh - weak-vectorの追加 / MSYSサポート終了 / R7RS方針

今週もバグフィックス等はなし。そろそろリリースどき?

weak-vectorGC collection portのサポート

nmoshがweak-vectorGC回収ポートをサポートした。
weak-vectorは、GCによって回収されても良いものを内包したベクタで、GCによって内容物が回収されると#Fがセットされる。APIGaucheの物と一緒にした。

GC回収ポートはnmoshの非同期 I/O APIに固有のもので、あるオブジェクトが回収されると、queueにイベントが送信される。こっちのAPIは決めていないが、Chez SchemeのガーディアンのようなAPIにしようと考えている。
ただ、moshがBoehmGCを利用している都合上、"GCによってオブジェクトが回収されるとわかった頃には、そのオブジェクトは回収されてしまっていてアクセスできない"ため、Chezのガーディアンのように、一旦GCされてしまったオブジェクトを取り戻すことはできない。
GC回収ポートの具体的なユースケースとしては、グラフィックスコンテキストの回収に使うつもり。BoehmGCのファイナライザ(あるオブジェクトが回収されたときに呼ばれるコールバック関数)は、どのスレッドから呼ばれるかが規定されていないため、ファイナライザではqueueへのenqueueだけを行い、queueの面倒をみているスレッドが実際の解放処理を行う。

MSYSサポートを終了

MSYSのサポートを終了することにした。WindowsビルドはCMakeを通すということで。。0.2.7からはWindows版のバイナリ配布を再開する予定なので、とくに問題になるケースは無いはず。
というのは、nmoshで使用している非同期I/Oは比較的新しい(NT4やWin2000には無い)Windowsの機能なので、ますます通常の人間にはビルドしづらいものになるため。。
CMake + MinGW gccでビルドすることはもちろん可能です。(MSYS != MinGWなことに注意!)

R7RSサポート計画

0.2.7には入らない予定。(scheme base)のようなWG1ライブラリを入れて0.2.8を出す。かも。もっとも、R7RSはまだドラフトがでたばっかりなので多くは未定。
特に重要なポイントのいくつかは議論が始まってしまったのでそれを見守っているところ。
R7RSのパブリックなMLは http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports です。僕も実装の過程で気づいたことはコメントしてます。
最初のR7RSサポートでは:

  • R6RSプログラムからR7RSモジュールが利用できる
    • R6RSのsyntax-rulesとR7RSのsyntax-rulesにはまったく相互運用性が無いのに注意。
  • R7RSモジュールとしていくつかのSRFIを提供する
    • SRFIに関しては、R6RS側に関しても順次R7RSなモジュールに移行できたら良いなぁ。。と。
  • R7RSモジュール構文をサポートする
    • include、include-ciはキャッシュにも対応。
  • REPL,EVALをサポートする
  • R7RSエントリフォーマットはサポートしない
  • R7RSプログラムでもR6RS形式のライブラリ構文とトップレベルプログラム構文をサポートする。

といった感じになるのを予定。R7RSモジュールから手続きをimportするのはちゃんと機能するようにしようと思ってます。構文は微妙で、特に補助構文を使うものは一切互換性が無くなる予定。。
R7RSのexpanderは自前のexpanderにする予定です。当初はnmoshをそのまま使おうと思ってたんですが、explicit-phasingなexpanderだと、explicit-renamingがポータブルに実装できない(!)事に気づいたので方針変更。。(あとで書く)