2012-09-27 12 views
6

-Hi. Ich möchte Scala REPL mit initialisierte Umgebung in meine App einbetten. Ich habe IMain Klasse angesehen und es scheint, ich könnte es über Instanz davon tun. Die Instanz wird erstellt und dann in intp public var in von ILoop gespeichert.Scala - REPL-Umgebung initialisieren

Wie kann ich einige Namen binden und/oder einige Importe vor process() (z. B. vor REPL) hinzufügen?

folgender Code nicht auf der Linie 3, weil intp noch nicht erstellt wird (=> 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) 

du- danken.

UPDATE: Übergeordnete createInterpreter() leider nicht funktioniert:

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 auf Eingang stecken (sieht aus wie Deadlock, geschieht nur mit dem Code oben):

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> 

Vielen Dank für Vorschlag dvigal.

Antwort

4

Es gibt ein Github-Projekt namens scala-ssh-shell was tun können, was Sie wollen, oder zumindest Sie näher.

+0

Ich schaute auf das Projekt und es scheint, es wird funktionieren. Vielen Dank. – woky

1

-Hi, sorry ich nicht Scala REPL Hacker, aber ich denke, man kann so etwas tun:

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

netter, danke, leider funktioniert es nicht, ich habe die Antwort aktualisiert – woky