この質問に答える前に、まずScalaのバージョンを修正して質問を再現できるようにしてください。 Scala 2.11.8、sbt 0.13.11、spire-math 0.11.0を使用すると仮定しましょう。
その後裸build.sbtは次のようになります。
name := "test"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value
libraryDependencies += "org.spire-math" %% "spire" % "0.11.0"
とあなたのコードは次のように見て、Test.scala
ファイルに保存することができます:sbt run
を実行する際に
import spire.implicits._
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
object Test {
def main(args: Array[String]) = {
val toolBox = currentMirror.mkToolBox()
val src ="""
|(a: spire.math.Jet[Double],b: spire.math.Jet[Double]) => a + b
""".stripMargin
println (toolBox.eval(toolBox.parse(src)))
}
}
、あなたが得ます:
$ sbt run
[info] Running Test
[error] scala.tools.reflect.ToolBoxError: reflective compilation has failed:
[error] could not find implicit value for parameter f: spire.algebra.Field[Double]
したがって、あなたの質問は、なぜですかimport spire.implicits._
で定義された暗黙が、toolBox
がインスタンス化され、eval
が呼び出されるスコープに含まれているにもかかわらず、失敗します。
あなたのユースケースでは、コンパイラが独立して呼び出される2つの段階があります。第1段階はTest.scala
のコンパイルであり、第2段階はコンパイルと実行です(a: spire.math.Jet[Double],b: spire.math.Jet[Double]) => a + b
この2つのステージは同じランタイムで動作しません。最初の段階では、コンパイラはTest.scala
ファイルをコンパイルするために呼び出され、2番目のコンパイラはsrc
文字列をコンパイルするためにJVMランタイム内で呼び出されます。その結果、これらの2つのステージは異なるランタイムで実行されるため、同じスコープを共有しません。
この問題の1つの迅速な解決策は、第2段階の範囲内に含意を「再導入する」ことです。
import spire.implicits._
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
object Test {
def main(args: Array[String]) = {
val toolBox = currentMirror.mkToolBox()
val src ="""
|import spire.implicits._
|(a: spire.math.Jet[Double],b: spire.math.Jet[Double]) => a + b
""".stripMargin
println (toolBox.eval(toolBox.parse(src)))
}
}
に結果:これは、あなたの質問に答える
希望言い換えれば、あなたがコンパイルしようとする文字列でimport spire.implicits._
を付加しました。 Scalaコンパイラがスコープ内のインプリシットをどのように検索しているかについての詳細な解答が好きなら、良いスタートはhereです。
目的は何ですか? – cchantep
@cchantep - 明確にするために編集されました。 – NietzscheanAI