repl que online scala read-eval-print-loop

scala - online - repl que es



Ejemplo de intérprete REPL de Scala para 2.10 (2)

Basado en la excelente respuesta de Ben, a continuación hay una clase de ayuda para facilitar el inicio del intérprete. Uso:

Repl.run(("e", "Double", 2.71828), ("pi", "Double", 3.1415))

Detecta automáticamente cuando se está ejecutando desde SBT y se acomoda.

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.") } }

Dé un ejemplo de código de cómo crear un intérprete REPL incorporado de Scala mediante programación, que funcione en Scala 2.10. (Agregué estas preguntas y respuestas después de pasar horas combinando varios códigos para obtener un intérprete que funcione)


Ejemplo 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) }

Algunas notas

  • Elijo mostrar JLineReader (predeterminado) en lugar de SimpleReader porque funciona mucho mejor, manejando correctamente las teclas de flecha, eliminar, etc. JLine agrega una dependencia de jar.
  • El ejemplo muestra cómo vincular valores en la respuesta (variable e anterior).
  • Cuando omito la settings.Yreplsync.value = true , el REPL se bloquea y no sirve para nada.
  • Desde mis pruebas, si se combinan las configuraciones usejavacp y embeddedDefaults , se produce un error

Encuentro esto más fácil de probar a través de SBT; una muestra 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" )

Muestra de sesión 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>