2012-01-18 11 views
14

No estoy seguro de cómo escribir código que permita incluir un intérprete en el código de Scala 2.9. Esta pregunta es un seguimiento de this one, que le preguntó cuál es el equivalente de la Scala,Cómo escribir el código de Scala 2.9 que permitirá el acceso a un intérprete

import pdb 
pdb.set_trace() 

era de Python. El consejo dado allí fue principalmente para Scala 2.8, y los paquetes relacionados ya no existen en su forma anterior. A saber,

  1. scala.nsc.tools.nsc.Interpreter.{break, breakIf} han sido trasladados a scala.nsc.tools.nsc.interpreter.ILoop.{break, breakIf}
  2. DebugParam está ahora en NamedParam scala.tools.nsc.interpreter

Como se señaló en el post original, la ruta de clase del proceso padre es no se pasó automáticamente al nuevo intérprete, por lo que se presentó una solución alternativa here. Desafortunadamente, muchas de las clases/métodos invocados allí ahora han cambiado, y no estoy muy seguro de cómo modificar el código para que se comporte como "esperado".

Gracias!

EDIT: Aquí está mi código de prueba, que al compilar y ejecutar actuales, pero intentar ejecutar cualquier cosa en los resultados del depurador en la aplicación de congelación si compilado por scalac y ejecutado por scala

import scala.tools.nsc.interpreter.ILoop._ 

object Main extends App { 

    case class C(a: Int, b: Double, c: String) { 
    def throwAFit(): Unit = { 
     println("But I don't wanna!!!") 
    } 
    } 

    // main 
    override def main(args: Array[String]): Unit = { 

    val c = C(1, 2.0, "davis") 

    0.until(10).foreach { 
     i => 
     println("i = " + i) 
     breakIf(i == 5) 
    } 
    } 
} 

Edit2: Como mi configuración actual se está ejecutando a través de sbt, he descubierto que este tema está cubierto in the FAQ (parte inferior de la página). Sin embargo, no entiendo la explicación dada, y cualquier aclaración en MyType sería invaluable.

Edit3: otra discusión sobre el tema sin solución: http://permalink.gmane.org/gmane.comp.lang.scala.simple-build-tool/1622

+0

me he encontrado esto también esta noche. Incluso: el objeto Main extends la aplicación {scala.tools.nsc.interpreter.ILoop.breakIf (true)} se bloqueará. – arya

Respuesta

4

así que sé que esto es una vieja pregunta, pero si su REPL está colgando, me pregunto si el problema es que you need to supply the -Yrepl-sync option? Cuando mi REPL incrustado estaba colgando en una situación similar, eso lo resolvió para mí.

Para establecer -Yrepl-sync en un REPL incrustado, en lugar de utilizar breakIf tendrá que work with the ILoop directly para que pueda acceder al objeto Settings:

// create the ILoop 
val repl = new ILoop 
repl.settings = new Settings 
repl.in = SimpleReader() 

// set the "-Yrepl-sync" option 
repl.settings.Yreplsync.value = true 

// start the interpreter and then close it after you :quit 
repl.createInterpreter() 
repl.loop() 
repl.closeInterpreter() 
+0

Esta solución de hecho funcionó para mí por el problema que tenía OP. Incluso puede escribir su propio 'break' y' breakIf' de esta manera. –

Cuestiones relacionadas