週刊mosh - 0.2.7進捗
再起動中...
mosh-currentの更新を再開しました。http://storage.osdev.info/pub/mosh/mosh-current.tar.gz
処理中のIssue
psyntax-moshのいくつかのバグフィックス。
このバグはSRFIライブラリ( https://launchpad.net/scheme-libraries )をアップデートする過程で発見された。まだpsyntax-moshにはいくつかのバグが残っているので、最新版への追従はできていない。
nmoshは最新のSRFIライブラリを使用できる。(srfi-updateブランチ)
OpenされたIssue
- http://code.google.com/p/mosh-scheme/issues/detail?id=193
- http://code.google.com/p/mosh-scheme/issues/detail?id=194
- psyntax-moshがinternal defineを正常に展開しない
- http://code.google.com/p/mosh-scheme/issues/detail?id=195
- psyntax-mosh上のwith-syntaxがbodyを持たない
- http://code.google.com/p/mosh-scheme/issues/detail?id=191
- http://code.google.com/p/mosh-scheme/issues/detail?id=196
- (mosh concurrent)のexampleが間違っている
ライブラリのprecompile
従来、psyntax-moshはmake installの最後に、misc/scripts/precompile-target.scmを実行して、$HOME/.moshの中にキャッシュを生成していた。これは非常に限られたケース(sudo make install かつ 過去にmoshを通常のユーザ権限で実行したことがある状態)でしか正常に動作しないことが分かっているので、0.2.7からは”mosh_config --precompile"でprecompileできるように変えたい。
しかし、psyntax-moshは"ファイルを確実にキャッシュさせる"手段が存在しないので難航中。psyntax-moshがライブラリをキャッシュするのは、プログラム(*.sps)を実行して、かつ、正常に全てが展開された場合のみ。例えば、REPLからimportしたライブラリは何故かキャッシュされない。
簡単にはmosh_config --precompileとすると、実際にprecompileする代わりにスクリプトを出力することにして、
のように、パイプで実行させることだろう。。
nmoshでは単にevalするか、
nmosh library.sls
のようにして、プログラムのようにライブラリを実行すればキャッシュされる。mosh_configはnmosh向けには提供されないので、"nmosh -T precompile"でprecompileを行うことにする。
プラットフォームサポート
現状ではPowerPCやMIPSでテストできていない状態。0.2.7をこれらでテストせずにリリースするかは未定。
NetBSDでのコンパイルを解禁。しかし、gcc4.1やgcc4.3では正常にコンパイルされないので難しいところ(i386)。amd64や他のアーキテクチャはまだテストしていない。
Win64での動作はそれなりにmatureだが、何らかの理由でpointerが32bitに切り詰められるケース有り。
これは、そもそもmoshがsizeof(intptr_t) != sizeof(long)な環境を想定していないことに因るので、解決にはかなり抜本的な対策が必要。
今のmoshには、整数オブジェクトを生成する方法がmakeInteger(long)しか無い。Win64の場合、makePointerInteger(intptr_t)とmakeInteger(long)に分割する必要が有る。これを0.2.7でやるかは未定。。
Gaucheでbootstrapできない問題
- http://practical-scheme.net/chaton/gauche/a/2011/03/15#entry-4d7fb603-f3310
- http://gauche.git.sourceforge.net/git/gitweb.cgi?p=gauche/Gauche;a=commit;h=efd86037909b6ffadb7a74aad815cfc1ba258574
moshはbootstrapにGaucheを使っている。このため、Gaucheの仕様変更にも追従する必要がある。
- 0.8.x → 0.9: Gaucheは0.9からinternされないシンボルをサポートしたため、(gensym)で生成したシンボルを変換する必要が有った。
- 0.9 → 0.9.1(今回の問題): Gauche 0.9.1で導入されたmatchの最適化で、moshのVMコンパイラをGaucheで実行することができなくなった。
細かい事情はchatonのログに有る。
対策としては、Gauche側のutil.matchではなく、moshの提供するmatch構文をGauche側でも常に使用するようにした。可能な限りGauche側の構文を使わないことで、Gauche側の変更に対してよりrobustになることが期待される。
原理的には、moshのbootstrapにmoshを使うこともできる。しかし、moshのコアはR6RSでないので、R6RS Schemeであるmoshでbootstrapするのは難しい。