ScalaSignature を直接使うべきか否か

このblog書こうと思ったのは以下のtweet

まず、結論から言うと、(現段階では)積極的に使うべきものではない と思います。

ところで、以前ScalaSignatureについてちょっと書いたことがあるので、以下も参考に

ScalaSignature ががががが

以下

  • 積極的に使うべきではないと思う理由
  • (完全ではないが)ScalaSigを直接いじる以外の代替案
  • もし使うとしても、使う場合のリスクの説明

などを書いていこうかと思ったけど、あることを思いつき↓

質問内容としては、

  • 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 さんが作ってるライブラリの話


さらに追記
しかし、リフレクションがスレッドセーフじゃないことにより、色々難しい・・・

*1: Signatureのデータ構造だけ決めるから、自分でParserを書くという手もありという意味

*2: 追記で質問した後の回答により、すべて取得できるっぽい

*3: 2.10でたとしても、いまのプロジェクトが2.9使っていて、2.9上で色々やりたいんだ!というなら別ですが