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 ?