Bitte geben Sie ein Codebeispiel für die programmgesteuerte Erstellung eines eingebetteten Scala REPL Interpreters, der in Scala 2.10 funktioniert. (Ich habe dieses Q & A nach Stunden Kämmen verschiedenen Codefetzen verbringen einen Arbeits Dolmetscher zu bekommen)Embedded Scala REPL Interpreter Beispiel für 2.10
16
A
Antwort
22
Beispiel 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)
}
Einige Anmerkungen
- ich die JLineReader zu zeigen, wählen (Standard) statt
SimpleReader
, weil es viel besser funktioniert, Pfeiltasten richtig handhaben, löschen etc. JLine fügt eine Jar-Abhängigkeit hinzu. - Das Beispiel zeigt, wie Werte in den repl (Variable
e
oben) gebunden werden. - Wenn ich
settings.Yreplsync.value = true
weglasse, hängt die REPL und ist nutzlos. - Aus meiner Prüfung, wenn beide
usejavacp
undembeddedDefaults
Einstellungen miteinander kombiniert werden, ergibt sich ein Fehler
Das finde ich am einfachsten über SBT zu testen; build.sbt
ein Beispiel:
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"
)
Beispiel SBT Sitzung:
> 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
Basierend auf Bens ausgezeichnete Antwort, ist eine Hilfsklasse zu erleichtern, den Interpreter zu starten. Verbrauch:
Repl.run(("e", "Double", 2.71828), ("pi", "Double", 3.1415))
Es erkennt automatisch, wenn Sie von SBT laufen und aufnimmt.
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.")
}
}
Verwandte Themen
- 1. Embedded Scala REPL erbt übergeordneten Klassenpfad
- 2. Embedded Javascript Interpreter für PHP
- 3. Dokumentieren Scala 2.10 Makros
- 4. Scala REPL zusätzliche Gläser
- 5. Embedded Prolog Interpreter/Compiler für Java
- 6. Scala - REPL-Umgebung initialisieren
- 7. Scala 2.10 TypeTag Verwendung
- 8. Funktioniert der Scala-Interpreter genau so wie ein anderer Interpreter?
- 9. Wie reflektiere ich Anmerkungen in Scala 2.10?
- 10. Suchen in scala 2.10 ASTs
- 11. Anfänger: Scala-Typ Alias in Scala 2.10?
- 12. Scala REPL programmgesteuert starten?
- 13. Fehler in Scala 2.10, Iterator.size?
- 14. Typesafe Stack und Scala 2.10
- 15. Scala 2.10, Double.isNaN und Boxen
- 16. Scala REPL entfernen Abhängigkeit
- 17. Scala REPL in Gradle
- 18. Workaround für einen scala.language.dynamics Bug in Scala 2.10 Compiler
- 19. Convert scala 2.10 Zukunft zu scalaz.concurrent.Future // Aufgabe
- 20. Unicode Regex in Scala REPL
- 21. Was ist der Unterschied zwischen Clojure REPL und Scala REPL?
- 22. Statische Importe innerhalb scala REPL
- 23. Haben sich Scala-Fallklassenanmerkungen in 2.10 geändert?
- 24. Paket Kompatibilität zwischen Scala 2.10 und 2.11
- 25. Mit Scala 2.10 `to` Liste in SortedMap
- 26. So verwenden Scala 2.10 implizite Klassen
- 27. Typ einer Fallklasse in Scala Aliasing 2.10
- 28. Java <-> Scala Sammlung Konvertierungen, Scala 2.10
- 29. Unterschied zwischen Scala REPL und Clojure REPL - kompilieren Geschwindigkeit
- 30. Typ Parameter über Reflexion in Scala 2.10 zu finden?
antwortete ich dieses http://stackoverflow.com/a/18418634/1296806 aber ich glaube nicht, habe ich versucht, 2.10, und ich vergesse immer, dass -Yrepl-sync Möglichkeit. Habe auch keine sbt Konsole benutzt. Vielen Dank! –
Es gab auch diese Frage über verbindliche Werte und Klassenladeprogramme http://StackOverflow.com/a/18503457/1296806 Ich kann nicht sagen, ob es gute Informationen sind, weil es ignoriert wurde. Wo denkt die Masse, wenn du sie brauchst? –
@ som-snytt Ja, Ihre Antwort war die einzige nützlichste Quelle für dieses Beispiel –