Thrift IDL の文法に typedef があるなんて今まで知りませんでした… http://bit.ly/hAUnmF
2011-03-27 02:18:13ThriftのIDLは謎が色々。フィールドの区切りも引数の区切りも ListSeparator で、, と ; のどちらも使えるようになっている。Throwsの引数が何故かFieldで、Identifierが必須。map/setとlistでcpp_typeが入る場所が逆。
2011-03-27 02:40:31Literal というとソースコード中の定数というか値のことだと思うのだけど、Thrfit IDL の中では Literal は文字列の定義。代わりに ConstValue という定義があるのだけど、それが Literal じゃないのかな、とかとか…
2011-03-27 02:47:30なるほど Literal が文字列のみですね[36]。IDL だから良いのかな?通常の言語だと Literal は int literal, long literal とかに分かれていきますねー
2011-03-27 02:52:42あと細かいけども、NamespaceScopeで言語の名前を指定して個別の名前空間を設定できるのだけど、C++の表記はcpp、Javaの表記はjavaで、それならRubyはrubyと来ると思ったらrbで、Pythonはpy。ファイルの拡張子かな?と思えば、Perlはperl。
2011-03-27 02:51:18@muga_nishizawa ある程度言語に依存した記述が入ってしまうのは仕方ない気がします。言語依存というか、アプリケーションに依存した記述ですが。
2011-03-27 02:54:25@frsyuki namespace の 'cpp' やら 'java' やらは仕方ないですか… CppType は…
2011-03-27 03:04:09@muga_nishizawa CppTypeはイマイチな感じですね。拡張性が無いし、アプリケーション(実装)に固有な指定でなくて、言語に固有なのはちょっとハズしている気がします。
2011-03-27 03:05:44IDLはインタフェースを記述すると同時に、実装の生成もするので、実装に依存した記述も書きたくなる。たぶん、レイヤーを分けた方が良いのだけども、綺麗に分けられない気がするので、イザと言うときは泥臭く書けた方が実用性は良さそう。
2011-03-27 02:57:09昔、筒の部分に歯磨き粉を入れられていたうまい棒を、気づかずに食べてしまい、残念な気持ちになったことがある。
2011-03-27 02:27:50"typespec"文を追加して、struct X { 1:list<string> key; }; typespec X.key cpp:std::vector<string>, java:ArrayList<String>; とか。
2011-03-27 03:07:18cppのところは拡張可能として、 typespec X.key MyApp:std::vector<string> と書けるとか。
2011-03-27 03:09:15型の種類をインタフェースに基づいて決めるか、実装に基づいて決めるか微妙。Thriftはインタフェース。実装に基づくなら、 map は map と ordered_map と に分ける必要とか、list は link_list と array_list に分けるとか。
2011-03-27 03:12:37実装に基づいた型にすると、言語によってサポートしていない型が出てきてしまう。例えば Ruby には ordered_map に相当する型が無い。これを Hash で生成してしまうか、ordered_mapの意味論を実装したクラスをIDL処理系が提供するか。
2011-03-27 03:14:02実装に基づいた型にするとIDL処理系の実装が大変なので…処理系ではインタフェースに基づいた型だけを提供して、実装に基づいた型を明示したい場合は、ユーザーが指定できるのが良さそうだと思っているところ。
2011-03-27 03:17:49