.mjt/mosh/yuniport のバックアップ差分(No.2)



[[.mjt/mosh/canvas]]
 
 (yuniportの名称はリリースまでに変更予定)
 
 * (ext yuniport) - 一般化ポート [#cfb4a518]
 
 (mosh concurrent)をwrapし、拡張可能なメッセージポートを実装する。
 
 通常のユーザプログラムではdispatch-loop:を利用する。ユーザプログラムによるファクトリの作成はまだ想定されていない。portへの書き込みはファクトリがライブラリを提供する。
 
 ** 命名規則 [#vcec32a0]
 
 一般化ポートを取り扱う手続きは : が後置される。
 
 一般化ポートのメッセージスロットは : が前置される。
 
 ** メッセージ [#x40306f5]
 
 メッセージは連想リストと同様の構造を持つ。連想の深さは1に制限されている。
 
 port実装は次のようなリストをシステムにpushする。
 
  (pointer-move :x 128 :y 64)
 
 このメッセージは、メッセージ名pointer-move、スロットx = 128、スロットy = 64を表す。ただし、このようなメッセージを直接操作するための手法は用意されていない。
 
 ユーザプログラムは、例えばdispatch-loopを用いて以下のように処理する必要がある。
 
  (dispatch-loop: port
   ((pointer-move x y) (display x y)))
 
 ** メッセージのアレンジ [#mb660904]
 
 (未実装)
 
 ** ファクトリ [#i81771a7]
 
 portはプロセスやシステムの状態を抽象化した"ファクトリ"オブジェクトにより生成される。
 
 ファクトリは直接操作してはならない。例えば(change-directory factory)とか(open-standard-window)のような個々のファクトリに固有の手続きを用いる。
 
 ファクトリのデータタイプは規定されていない。
 
 ** ポートの移送 [#ee67c298]
 
 未実装。
 
 yuniportの実体は(mosh concurrent)のportであり、移送に関して以下の制限がある。
 
 - 書き込みポートは自由に移送できる
 - 読み込みポートを移送することは出来ない
 
 ** ディスパッチループ [#l5b82986]
 
 *** (define-dispatch name <dispatch-clause>) [#n10bd39a]
 
 未実装。
 
 dispatchで利用できるパタンマッチ手続きを定義する。
 
 *** (dispatch-loop: (port <globals>) <dispatch-clause>) [#da96eab3]
 
 未実装。
 
 メッセージからglobalを抽出し、スコープに提供する。それ以外はdispatch-loop:と同様に働く。
 
 *** (dispatch-loop: port <dispatch-clause>) [#da96eab3]
 
 dispatch-loop:はportのためのmatchを提供する。これは(match)と似た機能を提供するが大部分が異なる。
 
 dispatch-clauseは以下の形式のいずれかでなければならない。
 
 - ((<message-name> <slot-spec> <slot-spec> ...) body ...)
 - (else body ...) ; 未実装
 - (after <TIME-SPEC> body ...) ; 未実装
 - (close body ...) ; 未実装
 - (close body ...)
 - (abort body ...) ; 未実装
 
 <slot-spec>は以下の形式のいずれかでなければならない。
 slot-specは以下の形式のいずれかでなければならない。
 
 - slot-name
 - (: slot-name bind-name) ; 未実装
 - (: slot-name <match-clause>) ; 未実装
 
 (match)と異なり、slotの順序は問わない。ここでのスロット名には:を前置してはいけない。
 
 bodyには、以下の幾つかの拡張構文を利用できる。
 
 *** (dispatch-close x) [#i18c2188]
 
 close(:を後置しないことに注意する)は関連づけられたポートを閉じてdispatch-loopを抜ける。
 dispatch-close(:を後置しないことに注意する)は関連づけられたポートを閉じてdispatch-loopを抜ける。
 
 現在の所、portを閉じる方法は無いので、これはdispatch-exitと同様に働く。
 
 dispatch-loopの返値はxとなる。
 
 *** dispatch-exit [#k90af958]
 
 exitは関連づけられたポートを閉じない以外はcloseと同様となる。
 dispatch-exitは関連づけられたポートを閉じない以外はdispatch-closeと同様となる。
 
 close中はdispatch-exitを使わなければならない。closeが実行されるときは、すでにportは閉じられている。
 
 *** dispatch-return [#p8feffbc]
 
 未実装
 
 *** dispatch-continue [#qd4e9644]
 
 未実装
 
 *** dispatch-handoff [#e918ec91]
 
 未実装
 
 ** ポートの合成 [#j70e9d34]
 
 ** RnRS port compatibility (VFS) [#b712a31d]
 
 ファクトリはRnRS portとの互換性を提供しているかも知れない。
 
 * (ext yuniport factory (3)) - port実装のためのライブラリ [#ee04df91]
 
 ユーザプログラムはこのライブラリを利用しないこと。
 
 ** スタブ [#of9f01ec]
 
 ** (port-body ctx arg) [#e118ddf8]
 
 port-bodyはport実装の本体であり、コンテキストと引数を受け取る。
 
 ** 手続き [#y173fc11]
 
 *** (yuni-spawn-reader! sym arg <library-name>) => yuniport [#je9b3e23]
 
 input portとなるプロセスを起動する。つまりこのプロセスではread:だけが発行でき、write:は発行できない。
 
 これによって作成されたportはユーザプログラムによってdispatchされることはできない。port実装はdispatch-loop:によってメッセージをdispatchできる。
 
 symはport-body実装の名前。(mosh concurrent)と異なり、複数のライブラリを指定することは出来ない。
 
 argにはシンボルとデータ(number、string、vector、bytevector)、リストだけを指定できる。これはコピーされるので送信後変更すべきでない。
 
 *** (yuni-spawn-writer! sym arg <library-name>) => yuniport [#o0150f6c]
 
 output portとなるプロセスを起動する。つまりこのプロセスではwrite:だけが発行でき、read:は発行できない。
 
 他の制限や動作はyuni-spawn-reader!と同様となる。
 
 *** (write: ctx msg) [#ebb8d459]
 
 自身のポートからデータを出力する。msgはlistでければならない。
 
  (write: ctx '(pointer-move :x 128 :y 64))
 
 *** (?: msg) => list [#nf0b3c05]
 *** (%recv port) => list [#nf0b3c05]
 
 自身のポートからデータを入力する。?:ではなくdispatch-loop:を用いるのが好ましい。
 
 dispatch-loop:は内部的にこれを用いている。
 
 *** (yuniport ctx) [#za5ed742]
 
 portを得る。これはread:やdispatch-loop:に渡すことが出来る。
 
 ** 予約スロット (未実装) [#ub6cbc39]
 
 幾つかのスロット名は予約されている。予約されたスロット名には*が前置される。
 
 -*timestamp* - メッセージのタイムスタンプ
 -*id* - メッセージのID
 
 

トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.009 sec.