このblog書こうと思ったのは以下のtweet
今ググってみたけど、ScalaのSigParserを活用する記事見かけないなぁ。type erasureで悩んでる人はこれで一発解決なんだけど、紹介しても、どれくらい需要があるものやら
2012-08-15 22:52:01 via web
まず、結論から言うと、(現段階では)積極的に使うべきものではない と思います。
ところで、以前ScalaSignatureについてちょっと書いたことがあるので、以下も参考に
以下
- 積極的に使うべきではないと思う理由
- (完全ではないが)ScalaSigを直接いじる以外の代替案
- もし使うとしても、使う場合のリスクの説明
などを書いていこうかと思ったけど、あることを思いつき↓
ScalaSignatureって何か、そもそも使うべきかという自分の考えをblog書こうかと思ったけど、それより英語で質問してみて他の人(あわよくばScala開発者の人)がどう思ってるのか答えてくれたほうが有益かと思い質問したが果たして URL
2012-08-16 19:27:01 via web
質問内容としては、
- ScalaSignatureってあるけど、parserはscala-library.jarじゃない場所にあって隠しAPIっぽいよね?
- でもなんかいくつかScalaSignature(のParser)を使ってるライブラリ知ってるんだけど
- ところで、ScalaSignatureの正式な仕様見つからなかったんだけど?
- Scalaのversionが変わったら、ScalaSignatureも変わるのか心配
- 正式な仕様がない?から、直接使うのってなんかリスクあるよね?
- Scala2.10からリフレクション入るし、ますますScalaSignature(のParser)を直接使うべき場面って減るよね?
- 結局ScalaSignatureって使うべきなの?
って感じです。英語の表現がうまくでなくてあれだったのですが、贅沢を言えば
- それらのリスクを承知してでも、ScalaSignatureを使うべき場面はあるのか(デメリットを上回るメリットがある場合があるのか?)
- できれば、ScalaSignatureを既に使っちゃってるライブラリ作者がそれ↑を答えてくれたら最高
- 中の人としては、ユーザーに使って欲しいと思ってるのか?
- (多分ないとは思うけど) 将来的にScalaSignature自体の仕様を正式に記述して、もっとどんどんScalaSignatureを単なるデータ構造をとして使ってもらう方向性あり得るのか?*1
とか聞きたかったんですが・・・。で、しかし中の人(Scalaのマクロ作者のxeno-byさん)から、かなり短いけど返信来ましたやったぁー (`・ω・)b
訳すと
2.10のリフレクションAPIは、javaのリフレクションとScalaSignatureを合わせて抽象化したものを提供するよ。
もし、ScalaSignatureのフォーマットが変われば、リフレクション(のAPI)がそれに応じて追従するよ
という感じでしょうか。なので、やっぱり結論としては
普通のユーザーは2.10がリリースされて、それに含まれるリフレクションのAPIを通してScalaSignatureの情報を取得するべき
だと思います。
ここで、
- 2.10ではリフレクション提供されるけど、2.9以前でScalaSignatureの情報を取得したい場合とかは?
2.10で提供されるリフレクションAPIは、ScalaSignatureに含まれている情報をすべて取得できるのか?*2
など、疑問を出そうとすればいくらでも出てきますが、いずれにせよなにかよっぽど急いでいるわけではない限り、2.10がでるのを待って、まずリフレクションのAPI使ってみるべきだと思います。( もし結果的にリフレクションのAPIだけで満足できなく、ScalaSignatureを直接さわる方針になるにしても )
もちろんScalaSignature自体いじるのは面白いので、実用的で将来性を見越したライブラリの作成ではなく、単なる興味の場合は大いに直で触っていいと思います。(自分も昔、とくにライブラリ作るわけでもないのに、ScalaSigParserを試して遊んでいたことがありましたし)
もし実用が主眼にあるなら、リフレクションAPIにより使いやすいインタフェースが提供されるかもしれないのに、独自に今このタイミングでScalaSignatureをいじるのは、かなり無駄骨を折る可能性が高いという意味です。*3
このblog書いた前後のtwitter上のTL↓
ScalaSignatureについてStackOverflowで質問したり、twitter上で教えてもらったりした
さらにその後↓
taroleo さんが作ってるライブラリの話
さらに追記
しかし、リフレクションがスレッドセーフじゃないことにより、色々難しい・・・