vala開始

http://live.gnome.org/Vala

ruby-1.9でgstreamerを使って遊ぶために開発環境をgentooに換装したのだが、いつの間にかvalaで遊び始める。


とりあえずHelloWorld

int main(string[] args)
{
  stdout.printf("hello\n");
  return 0;
}

エントリポイントは、Java風味にclassの中のstaticメソッドとして定義してもいいのだが、外にmain関数の方が好きなのでこれで。

コンパイル

$ valac -o hello hello.vala

とっかかりにはここのサンプルを参考にするのがよさげ。
http://live.gnome.org/Vala/Documentation#Sample_Code


で、ここからが本題。
GlibのMainLoopを使った非同期プログラミングをやるというのがValaを採用した目的なので、そっちに進む。


ここの
http://live.gnome.org/Vala/GIONetworkingSample
Asynchronous Server Example
にこんなコードがある。

bool on_incoming_connection (SocketConnection conn) {
    stdout.printf ("Got incoming connection\n");
    // Process the request asynchronously
    // ↓ asyncメソッドをbeginする
    process_request.begin (conn);
    return true;
}

// ↓ asyncメソッド
async void process_request (SocketConnection conn) {
    try {
        var dis = new DataInputStream (conn.input_stream);
        var dos = new DataOutputStream (conn.output_stream);
        //             ↓ streamのreadを非同期に待つ?
        string req = yield dis.read_line_async (Priority.HIGH_IDLE);
        dos.put_string ("Got: %s\n".printf (req));
    } catch (Error e) {
        stderr.printf ("%s\n", e.message);
    }
}

void main () {
    try {
        var srv = new SocketService ();
        srv.add_inet_port (3333, null);
        srv.incoming.connect (on_incoming_connection);
        srv.start ();
        new MainLoop ().run ();
    } catch (Error e) {
        stderr.printf ("%s\n", e.message);
    }
}

という感じに書けるらしい。
どうやらasyncメソッドの実行を、yieldで中断してイベントが来たら再開という書き方ができるっぽい。これは、Coroutine ?