libXXX を使わない

Web サービスみたいなのを作るとき、フロントエンドにスクリプト言語を使って、バックエンドに C++ でゴリゴリ押していきたいなら、libXXX を作ったりするよりプロセス間通信とかした方が何かといいよね的なはなしを以前友人としました。もう少し賢く(?)、汎用の RPC を使ってみようという試み。

SOAP でもいいんだけど、なんか SOAP は大がかりすぎる印象がある・・・。XMLRpc-c の方がちゃんと作られている印象。XMLRpc++ はすごくライトな作りで、適当に動かすならこれで十分、かな? それで、この ++ の方の実装がちょっとおもしろい。こういう RPC ライブラリって、引数のパースや戻り値の代入がめんどくさい印象があるが、C++ の種々の演算子をフル活用して、なるべく簡単に記述できるようにしている。具体的にはこんな感じ。

void add(XmlRpcValue& params, XmlRpcValue& result) {
  int x = params[0], y = params[1];
  result = x + y;
}

まぁ、要は int やら double やら string やら vector のキャストが、双方向で定義されている。型が間違ったら例外が飛ぶ寸法。うーん、スゴイ。C++ の悪いところをここまでうまく使ったのはなかなか見られない。

ところで、似たようなことを OCaml でやるなら、もっとうまくできるんじゃないかと思った次第。

let (add: XmlRpcValue -> XmlRpcValue) = function
Array [ Int a; Int b ] -> Int (a + b)
_ -> raise (Invalid_argument "")
型の定義や引数の個数のチェックがパターンマッチ一発でできる寸法。ocaml-xml-rpc というライブラリがあったのでサンプルを見てみたが、別にこういう設計にはなってなかった。まぁ、いいんですが。