6

-やあ。環境が初期化された Scala REPL をアプリに組み込みたいと考えています。私はIMainクラスを見てきましたが、そのインスタンスを介してそれを行うことができるようです。インスタンスが作成され、 of のintppublic var に格納されます。process()ILoop

いくつかの名前をバインドしたり、以前にprocess()(たとえば REPL の前に) いくつかのインポートを追加したりするにはどうすればよいですか?

intp次のコードは、まだ作成されていない (=> NPE)ため、3 行目で失敗します。

    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)

ありがとうございました-。

更新:createInterpreter()残念ながらオーバーライドは機能しません:

    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)

インタープリターが入力でスタックします (デッドロックのように見えます。上記のコードでのみ発生します):

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>

提案してくれてありがとうdvigal。

4

2 に答える 2

4

scala-ssh-shellと呼ばれる github プロジェクトがあります。これは、必要なことを実行するか、少なくとも近づけることができます。

于 2012-09-28T23:08:25.790 に答える
1

-こんにちは、申し訳ありませんが、私はScala REPLハッカーではありませんが、次のようなことができると思います:

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)  
    }
}
于 2012-09-28T03:52:19.140 に答える