2013-02-04 8 views
12

REFLのコードスニペットのツリーを表示するには、スカラ2.10.0マイルストーンの時代に、まだ反射が初期段階にあったときに、私はasked a questionをどうやって使うのでしょうか。優れた答えは、私が尋ねた以上に進んで、木がどのように解析され、評価されるのかを示したので、私は先に進んで、私が今日行っていた小さなプロジェクトでそれを使用しようとしました。 Scala ToolBoxでREPL定義を確認するにはどうすればよいですか?

は残念ながら、コードが解析され、任意のREPLの定義を参照するようには思えないような方法で評価:

scala> val x = 1 
x: Int = 1 

scala> import scala.tools.reflect.ToolBox 
import scala.tools.reflect.ToolBox 

scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
    getClass.getClassLoader).mkToolBox() 
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ... 

scala> tb.eval(tb.parse("x")) 
scala.tools.reflect.ToolBoxError: reflective compilation has failed: 

not found: value x 

それはREPLで作られた定義を認識するために取得する方法はありますか?

+0

REPLではなく、私はsbtプロジェクトに全く同じコード(https://gist.github.com/jedesah/5812481)を書きました。私はREPLと同じ動作をします。これがToolBoxが他のコンテキストで動作する方法であれば、私は非常に興味があると思います。 – jedesah

+0

@ UnncovercoverAgentツールボックスのコードは、「ルート」から到達可能なものにアクセスできます。そうでなければ、まったく役に立たないでしょう。あなたが示した場合、その変数は "root"で利用できませんでした。 –

+0

強烈な言葉が無用であり、自己完結型の木を評価するのに使用できます。いずれにしても、あなたが作業しているこの小さなプロジェクトはオープンソースですか?私は外部(ツリー自体から)の定義にアクセスする例を見たいと思っていますが、私はあなたが「ルート」からそれらに達することによって何を意味するのか正確にはわかりません。 – jedesah

答えて

6

最近、私はreplに掘り下げて、タイプマクロをサポートしようとしていたので、なぜうまくいかないのか説明できました。それを動作させることは次のステップになります:)

私は、replに入力されたすべてのスニペットがコンパイルされる前に定型文にラップされることを知っています。したがって、xは、奇妙な名前のパッケージ内でネストされたネストされたオブジェクトのフィールドになります。

明らかに、replは定義されたすべてのシンボルを追跡し、必要なインポートを生成したボイラープレートと共に注入します。したがって、後続の行はxが無条件であることが分かります。対照的に、ツールボックスは単にreplのクラスローダーを再利用しますが、インポートについては何もしないので、失敗します。

回避策は、何らかの形でreplを表すオブジェクトにアクセスし、定義されたシンボルについて尋ね、ツールボックスにフィードするコードに対応するインポートを生成することです。チケットを発行する場合は、2.10.1コードフリーズの狂気が終わった後(おそらく、今週の終わり)、回避策をコード化しようとします。

+0

[SI-7081](https://issues.scala-lang.org/browse/SI-7081) –

関連する問題