moshで修論は書けるのか - 途中経過編

いまは最終的な出力周りでトラブっているので難しいシチュエーションになっているが。。(埒があかないので図は書き直すことにした。。)
内容に関してはhttp://d.hatena.ne.jp/mjt/20100112/p1
moshに関するパート自体は非常に上手く行っている。TCPの実装といった実験はもとより、文書の整形や表記統一*1などもmoshで処理している。
というわけでmoshAWKperlをあまり使わなくて良い域に来ているように思える。ネットワークとXMLJSONは今後の重点強化ポイントということで。。
ただ、僕の使っているmoshは非公開の拡張が幾つかある。

  • ランタイムを.mosh/nmosh.bootから読む。再コンパイルせずにランタイムだけアップデートするため。
  • -5オプションはSchemeスクリプトだけでなくVM用の命令ベクタファイルも読む。
  • ライブラリを.mosh/libからも読む。このため、個人用のライブラリをインストールできる。
  • スタックトレースで行番号情報が出る。これは例外処理が遅くなるので入っていない。
  • GCが-DTHREAD_LOCAL_ALLOCかつ--enable-parallel-markで、一部のメモリ確保をスレッドローカルに行う。確かこれはincremental collectionをWin32で使うと事件が起こる(GCヒープを対象にWin32APIを呼べない)のでダメだった記憶がある。

gitのnmoshを使うとスタックトレースが出ない。これは、例外の表示ハンドラをR6RSで書くのと、スタックトレースを必要なときに採取するのが両立できないため。
個人的には例外を非局所脱出のために使って欲しくないんだけど、そういうベンチマークが有るので例外処理は遅くできない。mosh本体側でnmoshを実行していることを検出して適切なcondition-printerを呼び分けるようにする必要アリ。基本的にはmosh本体に手を入れるのは御法度にしている(グローバル束縛に対する多重defineの許可は例外)。

S式で書ける正規表現

gitリポジトリからmoshをインストールすると(irregex)という正規表現ライブラリが使えるようになる。
これを使うと、S式を使って構造的に正規表現を書いて、テキストを加工することができる。

このライブラリはPOSIX正規表現形式の文字列による正規表現も取り扱うことができるが、S式で書いた方が読みやすいと思う。
moshに移植されているirregexは最新版ではなく、現時点では一つ前のバージョン0.7.5が入っている。
irregex自体はR6RS schemeで一般的に動くので、moshのツリーの内部で管理するよりは独立したツリーにするほうが好ましいのだけど、標準ライブラリを外部に置くのも色々と問題があるので難しい。
この(irregex)を使って、修論を整形するスクリプトAWKから移植したりしている。moshの文字列はunicodeなので、日本語が入った文書でも問題なく処理できる。

*1:エディタの置換をログに残してるのでそれを後からチェックしている