Fornire un esempio di codice su come creare un interprete Scala REPL incorporato a livello di codice, che funzioni in Scala 2.10. (ho aggiunto questo Q & A dopo aver trascorso ore pettinatura vari scarti di codice per ottenere un interprete che lavora)Esempio interprete Scala REPL incorporato per 2,10
16
A
risposta
22
Esempio 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)
}
Alcune note
- ho scelto di mostrare il JLineReader (predefinito) anziché
SimpleReader
perché funziona molto meglio, gestisce correttamente i tasti freccia, elimina ecc. JLine aggiunge una dipendenza jar. - L'esempio mostra come associare i valori al repl (variabile
e
sopra). - Quando ometto
settings.Yreplsync.value = true
, il REPL si blocca ed è inutile. - Dal mio test, se entrambe le impostazioni
usejavacp
eembeddedDefaults
sono combinati insieme, un errore risultati
Trovo questo più semplice per testare tramite SBT; un campione 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"
)
di campionamento della sessione 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>
2
Sulla base di risposta eccellente di Ben, qui di seguito è una classe di supporto per facilitare lanciare l'interprete. Utilizzo:
Repl.run(("e", "Double", 2.71828), ("pi", "Double", 3.1415))
Rileva automaticamente quando si esegue da SBT e ospita.
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.")
}
}
Problemi correlati
- 1. settings.maxPrintString per Scala 2.9 REPL
- 2. Scala - Inizializza ambiente REPL
- 3. Scala REPL in Emacs
- 4. Scala REPL in Gradle
- 5. Embedded Scala REPL eredita il classpath genitore
- 6. stampa Unicode da Scala interprete
- 7. Qual è la differenza tra Clojure REPL e Scala REPL?
- 8. Impossibile creato JLineReader (Scala REPL)
- 9. Differenza tra Scala REPL e Clojure REPL - compilare velocità
- 10. Qual è la differenza tra un REPL e un interprete?
- 11. Cosa succede realmente dietro il runtime/REPL di Scala quando si esegue un programma ".scala"?
- 12. È possibile registrare l'output di Scala REPL?
- 13. grab scala REPL history (dalla console sbt)
- 14. Come eco l'input dell'utente in Scala REPL?
- 15. Come posso ottenere Scala ToolBox per vedere le definizioni REPL?
- 16. Quale comando utilizzare per analizzare le istanze in scala REPL?
- 17. Esiste un file di configurazione per Scala REPL/SBT Console?
- 18. Python per iOS interprete
- 19. Tasto di scelta rapida per interrompere REPL?
- 20. Compilatore presentazione Scala - Esempio minimo
- 21. REPL per ocamldebug?
- 22. Interprete/shell online Python 3
- 23. Errore di riferimento ambiguo spuri nel compilatore/interprete Scala 2.7.7?
- 24. Trova un tipo in REPL?
- 25. Sopprimi i tipi di ritorno in console sbt/Scala REPL
- 26. Come eseguire un file esterno dall'interprete interattivo scala (REPL)?
- 27. Scala REPL: come trovare il tipo di funzione?
- 28. Perché questo esempio di parametro implicito Scala non funziona?
- 29. come inserire un comando multi-linea nella Scala REPL
- 30. Come posso accedere all'ultimo risultato in Scala REPL?
ho risposto questo http://stackoverflow.com/a/18418634/1296806 ma non credo che ho provato 2.10, e ho sempre dimenticare che -Yrepl-sync opzione. Inoltre non ho usato la console sbt. Grazie! –
C'era anche questa domanda sui valori di associazione e sui programmi di caricamento classe http://stackoverflow.com/a/18503457/1296806 Non riesco a capire se sono buone informazioni perché sono state ignorate. Dove pensa la folla quando ne hai bisogno? –
@ som-snytt Sì, la tua risposta era la fonte più utile per questo esempio –