2012-09-27 12 views
6

-Hi. Mi piacerebbe incorporare Scala REPL con l'ambiente inizializzato nella mia app. Ho esaminato la classe IMain e sembra che potrei farlo tramite l'istanza di esso. L'istanza viene creata e quindi archiviata nella variabile pubblica intp in process() di ILoop.Scala - Inizializza ambiente REPL

Come posso associare alcuni nomi e/o aggiungere alcune importazioni prima dello process() (ad esempio prima di REPL)?

Dopo codice non sulla linea 3, perché intp non è ancora creata (=> 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) 

Grazie te-.

UPDATE: Overriding createInterpreter() purtroppo non funziona:

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) 

Interpreter è bloccato sull'ingresso (assomiglia situazione di stallo, si verifica solo con codice di cui sopra):

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> 

Grazie dvigal per il suggerimento.

risposta

4

C'è un progetto github chiamato scala-ssh-shell che può fare quello che vuoi, o almeno arrivare più vicino.

+0

ho guardato il progetto e sembra che funzionerà. Grazie. – woky

1

-Salve, mi dispiace non Scala REPL hacker, ma penso che si può fare qualcosa di simile:

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

bello, grazie, purtroppo non funziona, ho aggiornato la risposta – woky

Problemi correlati