【问题标题】:Importing class files into the Scala Interpreter IMain将类文件导入 Scala 解释器 IMain
【发布时间】:2013-01-15 05:33:56
【问题描述】:

我正在尝试使用 scala 解释器中的 IMain 方法来运行已转换为字符串的函数。但是我无法将用户创建的类导入解释器。

例如,您可以轻松地从 scala 数据库中导入类,例如:

val m = new IMain()
m.interpret("import scala.math.sin")
m.interpret("sin(10)")

只要解释器​​正在运行,这个导入就会一直存在。但是我一直无法找到导入我创建的类和对象(或任何私有库)的方法:

m.interpret("import sounder.Sounder.play"
m.interpret("play(t=>50*sin(2*Pi*t*400),0,10")

(play是一种通过电脑声卡播放声音的方法)

我已经尝试使用解释器中的所有方法,但似乎都没有。我想出的唯一解决方案是将类文件转换为一行 with ;将每一行分开并通过解释运行,但即使这样也存在阻止编译的问题。

是否有允许输入到解释器的方法,或者是否有另一个过程允许 scala 解释器处理字符串。

感谢您的帮助,我在 Windows 7 计算机上运行 Scala 2.9.2。

【问题讨论】:

  • 最终根本不使用 IMain,因为 0__ 给出的解决方案不起作用。相反,我创建了一个类,该类将使用模式匹配来确定正在使用的函数的类型。没有那么有效,也没有那么高效,但这是我能找到的最佳解决方案。

标签: scala interpreter


【解决方案1】:

您是否尝试过以下方法:

val m = new IMain() {
   override protected def parentClassLoader = sounder.Sounder.getClassLoader
}

在 Scala 2.10 中,您可以:

val s = new tools.nsc.Settings()
s.embeddedDefaults[sounder.Sounder]
val m = new IMain(s)

如果您通过sbt run 启动程序,您可能会遇到麻烦。手册会告诉您,您需要将 fork in run := true 添加到您的 build.sbt,但恐怕这对自定义库没有帮助。

【讨论】:

  • 该方法不适用于 scala 2.9.2。但是当我升级到 scala 2.10 时,另一个解决方案确实有效。虽然我最终只使用了新的字符串插值方法,例如: val func = "play(t=>50*sin(2*Pi*t*400),0,5)"; s"${func}"
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 2010-12-15
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2013-06-30
相关资源
最近更新 更多