mosh 0.2.5をリリースしました

今回から新しいR6RS実装のnmoshを含むようになりました。今回の変更は殆どnmosh関連なので、僕が作業しています。
ダウンロードはGoogle Codeですが、コードはgithubに有ります。see and fork http://github.com/higepon/mosh
ビルド回りはかなり変更されているので、今回のバージョンが動かないという人はぜひ教えてください。動作チェックはmake checkでできます。(make installの前にやるのがオススメ)

MacOS X 10.6と64bitのサポート

MacOS X 10.6でも正常にコンパイルできるようになりました。macportsからGMPをインストールして、

CFLAGS="-L/opt/local/lib -I/opt/local/include -D_XOPEN_SOURCE"\
 CXXFLAGS="-L/opt/local/lib -I/opt/local/include"
 ./configure
 make

のようにしてください。
64bitDarwinでのFFIはまだサポートしていません。ABIは同一なのでそう遠くないうちに。

(shorten)

Gauche風の短縮lambda、(shorten)が標準ライブラリになりました。Grand Central DispatchのBlocks表記みたいなもんだと思えば大体正解?
機能は、

  • lambda を ^ と書ける
  • (lambda (x) ...) を (^x ...)と書ける (x = a-z, _)
  • (lambda x* ...) を (^x* ...)と書ける (x = a-z, _)

の3つです。
Gaucheと比べて、a*のようなリスト表記が追加されています。これは、文字数的にはスペースを入れる表記と変わらないんですが、事故を防ぐためには有用だと思います。

(map (^ _ 'empty) lst0 lst1) ; lst0、lst1と同じ長さのemptyのリストを生成
(map (^_* 'empty) lst0 lst1) ; 同上。 * を付けると、リストを受ける。
(map (^_ 'empty) lst0 lst1) ; 間違い。スペースが足りないと1引数になる。

nmosh

nmoshは、従来採用していたpsyntaxに代わるexpanderです。Andre van Tonderの実装を使っていますが、それなりに変更してキャッシュやデバッガのような機能を追加しています。これはlarcenyのerr5rsモードと同様のexpanderで、いくつかの方言もLarcenyに準じています。
moshの代わりにnmoshを使うことで、新しいランタイムを試すことができます。nmoshは従来のmoshよりもずっと遅いですが、より親切なデバッグ情報を出力し、マクロや実行中のコードのデバッグがより容易になっています。
nmoshはエンドユーザから見ると :

  • デメリット
    • マクロと実行で完全に名前空間が分断されている。e.g. トップレベルdefineで定義した手続きをdefine-syntax中で使うことができない。(要望が多ければ対応する予定。。効率の問題が有るので微妙だけど)
    • キャッシュが大きい。nmoshはデバッグ情報を保存するので、キャッシュに必要なディスク容量は3倍程度になる。
    • 初回実行が遅い。初回以降の実行もI/O負荷が高い。
    • SRFI-38表現をスクリプト中で使えない。
  • メリット
    • デバッグ機能がそれなりに機能する。ypsilon程度には親切になったはず。
    • loadが使える。ypsilonのような、REPL中でのライブラリオーバーロードも可能。
    • キャッシュが信頼できる。時刻情報さえ正確なら。