0.3.0への(個人的な)予定

0.4でLLVMバインディングとyuniによるDSP*1、バージョンが0.5になったら窓の杜に載せるくらいの気迫で。

MinGW配布

現在のところMSVC版が標準のWindows配布で、パフォーマンス的な都合から今後もしばらくはMSVC版が標準の配布となるのが続くと思うけど、追加してMinGW版も配布に入れたい。
MinGW版はMSVC版と違って :

  • 各種ライブラリを同梱
    • 現在のところ、cairoとfreetype、Win32バインディングのサポートDLL(moshwin32.dll)のみ。
    • 配布にはLGPLも適用される。DLLとしてリンクするのでmoshへの利用は特に規制なし。
  • GUI版(moshw)が提供される
    • コンソールウインドウを表示しない
    • GUI版ではREPLは使えない
  • Windowsアプリケーションとしての動作の調整

例えばR6RSWindowsアプリケーションを書いて配布する際のベースとして使うことを想定している。

(mosh yuniport) : yuniの一般化ポート

フォーマットされたS式を入出力する型付一般化ポート。canvasやpacketはyuniportを使って入出力を行う。
yuniportはarrangeと呼ばれる手続きを設定でき、arrangeは人間にとって扱いやすい形とバイナリデータを相互に変換する。
例えば、ethernet-packetポートをdefault udpv4 arrangeで開くことで

(udp-packetv4 
  source-addrv4: #vu8(192 168 0 1) 
  destination-addrv4: #vu8(192 168 0 2) 
  source-port: 9999 
  destination-port: 9999 
  data: #vu8(0 0 0 0))

のようなリスト*2を受け取ることが出来る。スロットをリスト中の任意の位置に割り当てるユーティリティarrangeも提供される。
パケットの情報は適宜省略/補完される。たとえばパケットのチェックサムやデータ長のような情報は(明示的に要求/供給しないかぎり)*3省略/補完される。
bytevector->yunilistのarrangeはdefine-packet-formatやdefine-dictなどのyuni語彙で作る。現在のところこれはR6RSライブラリにコンパイルされて(bytevector関連の語彙を用いて)moshVMで処理される。逆方向のarrangeは自動的に生成される。
本来のyunilistはGaucheClojureのような一般化されたシーケンス/コレクションだが、この実装においてyunilistはlistと同様に扱われる。あまり効率は良くないが、現実的なパフォーマンスを得られる。
将来的に、yuniport/yunilistは(例えばR6RSを自然に拡張する形で)もっと一般的な名称に改称されるかもしれない。

(mosh canvas) : 2Dベクタ描画

主にcairoを使った描画。一般的な2D APIバインディングと異なり、まずSchemeデータとして描画リストを作成し、それをオブジェクトに変換してから描画する。これはデータのビジュアライズやちょっとしたスクリプトのUIを想定していて、ゲームのように常に全体がアップデートされるような用途は想定していない。
バックエンドは現状ではcairoのみ。GUI上でのリアルタイム描画はMinGWのみ。ファイルへの描画はPDF/PNG。hittestや差分アップデート等は提供しない*4
APIはyuniportを用いて実装されるが、通常のシチュエーションではyuniportの語彙を使う必要は無い。

(mosh packet) : パケットポート

libpcap(もしくはwinpcap)を使ってEthernetパケットのキャプチャとEthernet/IPv4/ARP/UDP/TCPレベルのヘッダのパースと構築を行える。define-packet-format等のyuni語彙はまだ提供されないので、予め提供されるパケットライブラリ以外をスクリプト中で定義して使うことは出来ない。
libusb0.xによるUSBもサポートするが標準配布にUSB関連のパケット定義を含むかは未定*5
夏のプロシンでデモ予定。時間的に無理かも。。
APIはyuniportを用いて実装されるが、通常のシチュエーションではyuniportの語彙を使う必要は無い。

*1:主に音声/画像処理やcanvasで使う頂点処理への利用を想定。

*2:ベクタでないのは、yuniがパケット中の可変長要素をサポートしているため。

*3:現状では絶対に省略/補完されるというバグが有る。これがかなり根深いので完全にリライトする予定。。

*4:これは将来のバージョンのcairoがサポートする予定なのでそれにあわせて。

*5:配布が肥大化するので。。