Proszę podać przykład kodu, jak programowo osadzić osadzonego interpretera REPL Scala, który działa w Scali 2.10. (dodałam ten Q & po spędzeniu godzin czesanie różne skrawki kodu dostać tłumacza roboczy)Embedded Scala Przykład tłumacza REPL dla 2.10
16
A
Odpowiedz
22
Przykład 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)
}
Kilka uwag
- wybrać, aby pokazać JLineReader (domyślnie) zamiast
SimpleReader
, ponieważ działa znacznie lepiej, poprawnie obsługuje klawisze strzałek, usuwa itp. JLine dodaje zależność od słoika. - Przykład pokazuje, jak powiązać wartości w repl (zmienna
e
powyżej). - Kiedy pomijam
settings.Yreplsync.value = true
, REPL zawiesza się i jest bezużyteczny. - Z moich badań, jeśli obie
usejavacp
iembeddedDefaults
ustawienia są ze sobą połączone, błąd wynika
Uważam to najłatwiejsze do przetestowania przez SBT; próbka 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"
)
Próbka SBT sesja:
> 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>
2
oparciu o doskonałą odpowiedź Bena, poniżej jest klasa pomocnika w celu ułatwienia rozpoczęcia interpretera. Użycie:
Repl.run(("e", "Double", 2.71828), ("pi", "Double", 3.1415))
Automatycznie wykrywa, kiedy biegasz z SBT i pomieści.
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.")
}
}
Odpowiedziałem ten http://stackoverflow.com/a/18418634/1296806 ale nie sądzę Próbowałem 2.10, a ja zawsze zapomnieć, że -Yrepl-sync opcja. Również nie używasz konsoli sbt. Dzięki! –
Było również to pytanie dotyczące wiążących wartości i ładowarek klas http://stackoverflow.com/a/18503457/1296806 Nie mogę stwierdzić, czy to dobra informacja, ponieważ została zignorowana. Gdzie tłum myśli, kiedy go potrzebujesz? –
@ som-snytt Tak, twoja odpowiedź była najskuteczniejszym źródłem dla tego przykładu –