abstype msgchan_type = ptr typedef msgchan = msgchan_type次の関数はメッセージチャネルを生成します:
fun msgchan_create (name: string): msgchan
実際の実装ではメッセージチャネルは redis のキューを参照する単なるキーで、関数 [msgchan_create] は与えられた名前に基づいたキーを算出します。
与えられたメッセージチャネルにメッセージを挿入するために、次の関数 [msgchan_insert] を使うことができます:
fun msgchan_insert
(chan: msgchan, msg: string, nerr: &int >> _) : void
[msgchan_insert] の3番目の引数は参照渡しで、メッセージの挿入に失敗するとその値を増やします。
与えられたメッセージチャネルからメッセージを取り出すために、次の関数 [msgchan_takeout] を使うことができます:
fun msgchan_takeout (chan: msgchan, nerr: &int >> _): stropt
[msgchan_takeout] の2番目の引数は参照渡しで、メッセージの取り出しに失敗するとその値を増やします。
[msgchan_takeout] は、通常の文字列か NULL ポインタどちらかを取る optional 文字列を返します。
NULL ポインタが返された場合もまた、なんらかの種類の失敗を示しています。
与えられたチャネルがその時点で空だったら、そのチャネルに対する [msgchan_takeout] 呼び出しはブロックすることに注意してください。
もしチャネルに対して [msgchan_insert] もしくは [msgchan_takeout] を呼び出した結果が失敗だったら、 2回目の試みの前にそのチャネルに関連した redis 接続を再確立させなければなりません。
いったん redis 接続が構成されると、この接続に関連する redisContext 値は (サイズ 1 であるような) 参照に保存されます。 次の関数は、(一時的な使用を目的として) 保管された redisContext 値を得ることができます:
fun the_redisContext_vtget (): [l:addr] vttakeout0 (redisContext(l))
このとき [vttakeout0] は次のように定義されています:
vtypedef vttakeout0 (a:vt@ype) = (a -<lin,prf> void | a) // borrowed linear value次のコードは典型的な呼び出しシーケンスを表わしています:
// val (fpf | ctx) = the_redisContext_vtget () // // Here is some code that makes use of [ctx] // prval () = fpf (ctx) // returning the borrowed context //このとき [the_redisContext_vtget] は redisContext 値とこの値を解放するための証明関数を得るために呼び出されています。 そして redisContext 値を使い終わったら、それを解放するためにその証明関数を呼び出します。
msgchan.sats msgchan.dats redisContextSetup.datsファイル [test_up.dats] は、ファイルの内容物をメッセージチャネルにアップロードするテストコードです。
ファイル [test_dn.dats] は、メッセージチャネルの内容物をファイルにダウンロードするテストコードです。
ATS ソースコードを [test_up] と [test_dn] にコンパイルするための Makefile があります。 IP アドレス 127.0.0.1 のポート 6379 で redis サーバが利用できることを仮定しています。 次のコマンドで実行すると:
cat msgchan.sats | ./test_up & ./test_dnファイル [msgchan.sats] の中身が逐次的にコンソールに表示されるのが見えるはずです。 このとき、連続した2行を表示する間に (せいぜい3秒程度の) 短い休止が入ります。