2012-09-27 53 views
6

-Hi. Tôi muốn nhúng Scala REPL với môi trường khởi tạo vào ứng dụng của tôi. Tôi đã xem xét IMain lớp và có vẻ như tôi có thể làm điều đó thông qua trường hợp của nó. Ví dụ được tạo và sau đó được lưu trữ vào intp công khai var trong process() của ILoop.Scala - Khởi tạo môi trường REPL

Làm cách nào để liên kết một số tên và/hoặc thêm một số nhập trước process() (ví dụ: trước REPL)?

mã sau thất bại trên đường 3 vì intp chưa được tạo ra (=> 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) 

Cảm ơn anh-.

UPDATE: Overriding createInterpreter() tiếc là không làm việc:

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 đang bị mắc kẹt trên đầu vào (trông giống như bế tắc, chỉ xảy ra với mã ở trên):

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> 

Cảm ơn dvigal gợi ý.

Trả lời

4

Có một dự án github gọi scala-ssh-shell có thể làm những gì bạn muốn, hoặc ít nhất giúp bạn gần gũi hơn.

+0

Tôi đã xem dự án và có vẻ như nó sẽ hoạt động. Cảm ơn bạn. – woky

1

-Hi, xin lỗi tôi không Scala REPL của hacker nhưng tôi nghĩ bạn có thể làm điều gì đó như:

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

tốt đẹp nhất, cảm ơn bạn, thật không may nó không hoạt động, tôi đã cập nhật câu trả lời – woky

Các vấn đề liên quan