週刊mosh - defineとletrec*の実行順序 / テストモード

あまり大きな動きは無し。

修正されたバグ

nmoshはプロセスIDをユニークIDに含むようになった。これによって複数のnmoshを同時に起動したときにユニークIDが被ってキャッシュに失敗するケースを防げるようになった。

defineとletrec*の実行順序

defineの実行順序が尊重されていないんじゃないか疑惑が提起された。伝統的にmoshはlet内のinternal-defineの動作が怪しいため、nmoshではそもそもletを避けている。
R6RS Schemeではいわゆるinternal-defineはletrec*のシンタックスシュガーとなるように定義されている。このため、実行順序は保証しないといけない。
しかし、R5RS当時では(たぶん)internal-defineはletrec(スターが無いことに注意)のシンタックスシュガーで、Gaucheからコンパイラの一部を引き継いでいるmoshは、こっちの定義で動いてしまっているのではないかと個人的には疑っている。

テスト用実行モード

moshにテスト用の実行モードを増やそうと考えている。というのも、(mosh test)以外のテストでは失敗しても終了値に影響が無いので、Makefile的に失敗したことにできないという問題があるため。
やらないきゃいけないことは、

  • MOSH_TEST_ENABLE環境変数の判定をテスト用ライブラリに追加する。以下のようにexit手続きの動作が代わるため。 --testというコマンドラインスイッチにするという手もあるが、moshはall-tests.scmの実行のために-tオプションを予約しているのでそれを無くすのが先。
  • テストモードでは、exit手続きは失敗するようにする。
  • テスト結果を報告するためのAPIを用意してSRFI-64/78と(mosh test)で使うようにする。

nmoshはポストモーテムデバッグ(スタックトレースをキャッシュディレクトリに保存して、あとから検証する機能)をそのうち入れるので、テストのログも同様にキャッシュディレクトリやユーザが指定したディレクトリに保存して、ログをHTMLなりなんなりに整形する仕組みを作るといいかも。
ライブラリAPIの呼び出し自体をログに取ることで、簡易的なカバレッジ機能として使えるかもしれない。