Acceda al intérprete durante la ubicación arbitraria del código scala

Vengo de un fondo de Python, donde en cualquier punto de mi código puedo agregar

import pdb; pdb.set_trace() 

y en el tiempo de ejecución seré transferido a un intérprete interactivo en ese punto. ¿Hay un equivalente para scala, o esto no es posible en tiempo de ejecución?

Sí, puedes, en Scala 2.8. Tenga en cuenta que, para que esto funcione, debe incluir scala-compiler.jar en su classpath. Si invoca su scala program con scala , se realizará automáticamente (o al menos eso parece en las pruebas que realicé).

Puede usarlo así:

 import scala.tools.nsc.Interpreter._ object TestDebugger { def main(args: Array[String]) { 0 to 10 foreach { i => breakIf(i == 5, DebugParam("i", i)) println(i) } } } 

Puede pasar múltiples argumentos de DebugParam . Cuando aparezca REPL, el valor de la derecha se vinculará a un valor cuyo nombre proporcionó a la izquierda. Por ejemplo, si cambio esa línea así:

  breakIf(i == 5, DebugParam("j", i)) 

Entonces la ejecución sucederá así:

 C:\Users\Daniel\Documents\Scala\Progtwigs>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5 

Continúa la ejecución escribiendo :quit .

También puede caer incondicionalmente en REPL invocando break , que recibe una List de DebugParam lugar de una vararg. Aquí hay un ejemplo completo, código y ejecución:

 import scala.tools.nsc.Interpreter._ object TestDebugger { def main(args: Array[String]) { 0 to 10 foreach { i => breakIf(i == 5, DebugParam("j", i)) println(i) if (i == 7) break(Nil) } } } 

Y entonces:

 C:\Users\Daniel\Documents\Scala\Progtwigs>scalac TestDebugger.scala C:\Users\Daniel\Documents\Scala\Progtwigs>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5 scala> :quit 5 6 7 scala> j :5: error: not found: value j j ^ scala> :quit 8 9 10 C:\Users\Daniel\Documents\Scala\Progtwigs> 

Para agregar a la respuesta de Daniel, a partir de Scala 2.9, los métodos break y breakIf están contenidos en scala.tools.nsc.interpreter.ILoop . Además, DebugParam ahora es NamedParam .

IntelliJ IDEA:

  1. Ejecutar en modo de depuración o adjuntar un depurador remoto
  2. Establecer un punto de interrupción y ejecutar hasta llegar a él
  3. Abra la ventana Evaluate Expression ( Alt + F8 , en menú: Ejecutar -> Evaluar expresión) para ejecutar código Scala arbitrario.
  4. Escriba qué fragmento de código o expresión desea ejecutar y haga clic en Evaluar
  5. Escriba Alt + V o haga clic en Evaluar para ejecutar el fragmento de código.

Eclipse:

A partir de Scala 2.10 ambos se break y se break breakIf se han eliminado de ILoop .

Para entrar en el intérprete, tendrás que trabajar con ILoop directamente.

Primero agregue la biblioteca del scala compiler . Para Eclipse Scala, haga clic derecho en project => Build Path => Add Libraries... => Scala Compiler .

Y luego puede usar lo siguiente donde quiera iniciar el intérprete:

 import scala.tools.nsc.interpreter.ILoop import scala.tools.nsc.interpreter.SimpleReader import scala.tools.nsc.Settings val repl = new ILoop repl.settings = new Settings repl.settings.Yreplsync.value = true repl.in = SimpleReader() repl.createInterpreter() // bind any local variables that you want to have access to repl.intp.bind("row", "Int", row) repl.intp.bind("col", "Int", col) // start the interpreter and then close it after you :quit repl.loop() repl.closeInterpreter() 

En Eclipse Scala, el intérprete se puede utilizar desde la vista de la Console :