週刊nmosh - ライブラリのstart/stop / プロンプトライブラリ

恥ずかしい誤字などを修正。

ライブラリのstart/stop

nmoshでは、"同一R6RSライブラリのinvokeはプログラムの実行中に高々1回"というルールを作っている。このルールが便利なのは、ライブラリの中で副作用のある初期化を行うことが出来る点で、nmoshのライブラリはかなり色々なところでこの特徴を利用している。
例えば、(nmosh io master-queue)ライブラリは、これをimportすることでIOCPやpoll()のようなOSの待受機構を初期化する。非同期I/Oを使用しているライブラリは全てこの(nmosh io master-queue)をimportすることで、非同期I/O機構が(一度だけ)初期化されることを期待できる。
この手のライブラリの初期化をいつ起動するかは微妙に難しい問題で、nmoshの場合は常に実際のプログラムの実行直前にまとめて実行される。たとえば、"ライブラリ内のシンボルが最初に使用された瞬間"のようなタイミングも考えることが出来る。
SchemeGCを期待した言語なので、明示的な後始末が一般的には存在しない。なので、nmoshにもライブラリのstartは有ってもライブラリのstopが無いC++にはオブジェクトのデストラクタが有るし、Win32のDLLにもアンロードの仕組みが一応存在する。(nmoshはexpandコードだけをunloadするオプションを提供しているが、あまり効果が無い)
startのタイミングを明示的に制御したいという需要はある。たとえば、アプリケーションを --help オプションを付けて呼び出すような場合は大多数のライブラリは初期化する必要がない。
(プログラム実行開始後の)evalのためにロードされるライブラリの扱いは難しい。nmoshはこのような場合にもライブラリを再度invokeすることはしないし、インスタンスはeval元のプログラムと共有される。

プロンプトライブラリ


REPLで使うようにプロンプトライブラリを整備中。REPL以外にも、プログラムに対話的インターフェースを付けたいことは意外と多いので、SchemeのREPLからは独立した機能性にしている。
もっともプロンプトライブラリは最初はpublicなライブラリでなく、0.2.8のREPL内でだけ使われる。
微妙に特徴的なのは:

Cursesを使うとフルスクリーンアプリになってしまうので、非常に面倒だけど手でECMA-48なエスケープシーケンスを出力している。Win32コンソールも同様。
流石に8色はどうかと思うのでXterm256とVista以降の24bitカラーにも対応するつもり。

  • 上下に配置されたstatic areaと普通に流れるログareaへの分割

プロンプト領域の上下にstatic areaを配置している。これはステータスライン等の表示を想定していて、nmoshでは大抵のプログラムが非同期に書かれることに因る。
ログは1行ごとにupper static areaよりも更に上に表示される。これは普通の出力なので、端末エミュレータやコンソールのスクロールバックにちゃんとログとして残る。