2012-09-27 14 views
6

-Hi. Chciałbym umieścić w mojej aplikacji Scala REPL z zainicjowanym środowiskiem. Przyjrzałem się klasie IMain i wygląda na to, że mógłbym to zrobić poprzez jej instancję. Instancja jest tworzona, a następnie zapisywana w intp publicznych zmianach w process() z ILoop.Scala - Inicjowanie środowiska REPL

Jak mogę powiązać niektóre nazwy i/lub dodać import przed process() (np. Przed REPL)?

następujący kod nie działa na linii 3, ponieważ intp nie został jeszcze utworzony (=> 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) 

Thank you-.

UPDATE: Zastępowanie createInterpreter() niestety nie działa:

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 utknął na wejściu (wygląda impasu, zdarza się tylko z kodem powyżej):

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> 

Dzięki dvigal za sugestię.

Odpowiedz

4

Jest projekt github nazywa scala-ssh-shell co może robić, co chcesz, a przynajmniej dostać się bliżej.

+0

Spojrzałem na projekt i wygląda na to, że zadziała. Dziękuję Ci. – woky

1

-Cześć, przepraszam, że nie Scala REPL haker, ale myślę, że można zrobić coś takiego:

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

miło, dziękuję, niestety to nie działa, zaktualizowałem odpowiedź – woky

Powiązane problemy