Ответ 1
Пример 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)
}
Некоторые примечания
- Я хочу показать JLineReader (по умолчанию), а не
SimpleReader
, потому что он работает намного лучше, правильно обрабатывает клавиши со стрелками, удаляет и т.д. JLine добавляет зависимость jar. - В этом примере показано, как связывать значения в repl (переменная
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>