【发布时间】:2013-09-08 19:50:39
【问题描述】:
请给出一个代码示例,说明如何以编程方式创建嵌入式 Scala REPL 解释器,该解释器在 Scala 2.10 中工作。 (我花了几个小时梳理各种代码碎片以获得一个工作解释器后添加了这个问答)
【问题讨论】:
标签: scala read-eval-print-loop
请给出一个代码示例,说明如何以编程方式创建嵌入式 Scala REPL 解释器,该解释器在 Scala 2.10 中工作。 (我花了几个小时梳理各种代码碎片以获得一个工作解释器后添加了这个问答)
【问题讨论】:
标签: scala read-eval-print-loop
基于 Ben 的出色回答,下面是一个帮助程序类,用于简化解释器的启动。用法:
Repl.run(("e", "Double", 2.71828), ("pi", "Double", 3.1415))
它会自动检测您何时从 SBT 运行并适应。
Repl.scala:
import scala.tools.nsc.interpreter.ILoop
import scala.tools.nsc.Settings
import java.io.CharArrayWriter
import java.io.PrintWriter
object Repl {
def run(params: (String, String, Any)*) {
def repl = new ILoop {
override def loop(): Unit = {
params.foreach(p => intp.bind(p._1, p._2, p._3))
super.loop()
}
}
val settings = new Settings
settings.Yreplsync.value = true
// Different settings needed when running from SBT or normally
if (isRunFromSBT) {
settings.embeddedDefaults[Repl.type]
} else {
settings.usejavacp.value = true
}
repl.process(settings)
}
def isRunFromSBT = {
val c = new CharArrayWriter()
new Exception().printStackTrace(new PrintWriter(c))
c.toString().contains("at sbt.")
}
}
【讨论】:
例如Repl.scala:
import scala.tools.nsc.interpreter._
import scala.tools.nsc.Settings
object Repl extends App {
def repl = new ILoop {
override def loop(): Unit = {
intp.bind("e", "Double", 2.71828)
super.loop()
}
}
val settings = new Settings
settings.Yreplsync.value = true
//use when launching normally outside SBT
settings.usejavacp.value = true
//an alternative to 'usejavacp' setting, when launching from within SBT
//settings.embeddedDefaults[Repl.type]
repl.process(settings)
}
一些笔记
SimpleReader,因为它工作得更好,可以正确处理箭头键、删除等。JLine 确实添加了一个 jar 依赖项。e)。settings.Yreplsync.value = true 时,REPL 挂起并且无用。usejavacp 和 embeddedDefaults 设置组合在一起,则会出现错误我发现这最容易通过 SBT 进行测试;一个样本build.sbt:
name := "Repl"
organization := "ExamplesRUs"
scalaVersion := "2.10.2"
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-compiler" % "2.10.2",
"org.scala-lang" % "jline" % "2.10.2"
)
SBT 会话示例:
> run-main Repl
[info] Running Repl
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37).
Type in expressions to have them evaluated.
Type :help for more information.
e: Double = 2.71828
scala> 2 * e
res1: Double = 5.43656
scala>
【讨论】: