mishima (737) の日記
イベントディスパッチについて
先日の yc の件は debian-users でも話題になってた。
いやまあ、普通に -inet で TCP 使え、っていう結論だったけど。
それは置いといて、イベントディスパッチについて考えてみよう。
今考えている xgsh 言語の一番の肝は、
なんと言ってもストリームを利用したイベント配信だ。
ほとんど全ての処理はデータソースからイベント受信し、
データシンクにイベントを送信するフィルタとして実現される。
しかし、データソースから読み出しフィルタを通してデータシンクに書きこむ、
それだけなら旧来の Unix プログラムと変わりがない。
問題は、エンドユーザが利用するためのプログラムの場合、
データシンクからデータソースへのフィードバックが必要になってくる、という部分。
commandA の出力を commandB の入力に使いたいが、
commandB の出力を再び commandA にフィードバックしたいような場合には、
単純な commandA | commandB という構造ではうまく行かないわけだ。
そうすると、commandB の出力を再度環境に落とし込み、
commandA は環境から入力を受ける…といった構造にしなければならない。
同じように問題になるのはイベントディスパッチ。
複数のイベントが同時に発生し、
それらが同一のデータソースに繋がっていた場合に、
イベント書き出しが衝突してはいけない、という問題だ。
それから、複数のデータシンクへのイベント配信を、
ひとつのデータソースから読み出したい、という欲求もある。
どうやって複数ストリームをまとめるかについては、うーん、ちょっと考えがまとまってない。
新たに sh を立ち上げるような感覚で環境を作成し、
その際に複数ストリームをまとめるのがいいのか?
で、今気付いたのは、実はこの言語って、LISPによく似てる、ってこと。
ただ、List の代わりに Iterator (つまりストリーム)を使う、
という点が違うけど。Itep って感じかなぁ。
リストで値を受け取り、関数で処理をし、リストで帰すのが Lisp なら、
イテレータで値を受け取り、フィルタで処理をし、イテレータで帰すのがこの言語。
で、イテレータにファイルストリームを、フィルタにコマンドを使うことによって
Unix との親和性(というか他の言語との親和性)を図ろうとしているんだけど。
記述は sh に近くなるんだろうが、
プログラマは全く異なる思考法を強いられるだろうな。
少なくとも単純な手続き型言語じゃないな。
ただ、この言語は、もう一度あのプログラミングスタイル…
sh の中から awk を呼び出し、sed を呼び出し、てな感じで
必要なコマンドを適時呼び出していたスタイルを復権させたいのだ。
Perl は便利だし、Python も便利だ。
しかし時には grep や find や sed や sort や wc のほうがかんたんに目的を果たせる場合がある。
なんでもかんでも一つの言語で書くのはかえって不便でしかないのだ。
例えば、こんなのはどうでしょう? (スコア:1)
複数のキュー/スタック(PerlやRubyの配列相当)をもつ、イベントドリブンのものにするというのは、いかがでしょうか?
キュー/スタックをコマンドに割り当てれば、パイプと違って一つのコマンドに対して、複数のコマンドが出力できます。また、フィードバックも簡単になります。
また、イベントデータにそれぞれデータ形式を表すタグをつけたり、同一のイベントデータを複数のコマンドで解釈させたりすると、面白いかも。反対に、イベントデータにタグ付けをせず、行単位に渡していくなら、各コマンドはこれまで通り標準入出力だけ気にしていればよいことになります。
Re:例えば、こんなのはどうでしょう? (スコア:1)
xgsh というのはそもそも、
「XMLによるタグで構造化されたイベント」
「GTK+ を使った GUI」
を柱として考えてた。
(最近は「esound で音も出たらいいなぁ」で xgesh にしようか、とか思ってたけど)
で、
> キュー/スタックをコマンドに割り当てれば、パイプと違って一つのコマンドに対して、複数のコマンドが出力できます。また、フィードバックも簡単になります。
それはいいアイディアかも。
問題は、「コマンドに割り当てられたキュー/スタック」という概念が
この言語だけで閉じてしまっていてはいけない、
他の言語からも容易に利用可能でないといけない、
という点。
例えば、環境変数 XGSH_DATASOURCE にデータソースとなる
Unix ソケットの位置がかいてある、とか。
で、Unix ソケットの先が「コマンドに割り当てられたキュー/スタック」
と繋がっていて…
ってな感じか。
あとは、この Unix ソケットにアクセスするためのコマンド
xgsh_recv_event, xgsh_send_event なんていうのを作れば、
他のすべての言語でも同様のイベント処理ができるようになるなぁ。
例だけど、
set event=`xgsh_recv_event`
case "$event" in
Click*)
xgsh_send_event 'HOGEHOGE'
;;
(以下省略)
みたいな感じ。
もちろん、標準出力への行単位の出力をイベントに変換するフィルタ
xgsh_list みたいなのを作れば、
ls | xgsh_list
で ls の結果がリストで出力されるとか。
# mishimaは本田透先生を熱烈に応援しています