2012-09-27 25 views
6

-Hi. Me gustaría incrustar Scala REPL con entorno inicializado en mi aplicación. Miré en la clase IMain y parece que podría hacerlo a través de una instancia. La instancia se crea y luego se almacena en intp var pública en process() de ILoop.Scala - Inicializar ambiente REPL

¿Cómo puedo enlazar algunos nombres y/o agregar algunas importaciones antes de process() (por ejemplo, antes de REPL)?

siguiente código de falla en la línea 3, ya intp no ha sido creada (=> NPE):

val x = 3 
    val interp = new ILoop 
    interp.bind("x", x) // -> interp.intp.bind("x", x) 
    val settings = new Settings 
    settings.usejavacp.value = true 
    interp.process(settings) 

Gracias You-.

ACTUALIZACIÓN: Anulación createInterpreter() por desgracia no funciona:

val x = 3 
    val interp = new ILoop { 
     override def createInterpreter() { 
      super.createInterpreter() 
      intp.bind("x", x) // -> interp.intp.bind("x", x) 
     } 
    } 
    val settings = new Settings 
    settings.usejavacp.value = true 
    interp.process(settings) 

intérprete se ha quedado atascado en la entrada (se parece a punto muerto, ocurre sólo con el código de seguridad):

x: Int = 3 
Failed to created JLineReader: java.lang.NoClassDefFoundError: scala/tools/jline/console/completer/Completer 
Falling back to SimpleReader. 
Welcome to Scala version 2.9.2 (OpenJDK 64-Bit Server VM, Java 1.7.0_06-icedtea). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> println 
<infinite_sleep> 

Gracias dvigal para la sugerencia.

Respuesta

4

Hay un proyecto llamado github scala-ssh-shell que puede hacer lo que quiera, o por lo menos llegar más cerca.

+0

Miré el proyecto y parece que funcionará. Gracias. – woky

1

-Hola, lo siento, no me hackers Scala REPL pero yo creo que se pueda hacer algo como:

class YourILoop(in0: Option[BufferedReader], protected override val out: JPrintWriter)   
    extends ILoop(in0, out) { 
    override def createInterpreter() { 
     if (addedClasspath != "") 
      settings.classpath append addedClasspath 

      intp = new ILoopInterpreter 
      val x = 3; 
      intp.bind("x", x) 
    } 
} 
object Run { 
    def errorFn(str: String): Boolean = { 
     Console.err println str 
     false 
    } 

    def process(args: Array[String]): Boolean = { 
     val command = new GenericRunnerCommand(args.toList, (x: String) => errorFn(x)) 
     import command.{ settings, howToRun, thingToRun } 
     new YourILoop process settings 
    } 
    def main(args: Array[String]) { 
     process(args) 
    } 
} 
+0

nice one, thank you, desafortunadamente no funciona, he actualizado la respuesta – woky