【问题标题】:Interaction between a REPL and a programREPL 和程序之间的交互
【发布时间】:2016-02-12 19:46:13
【问题描述】:

我想做的是创建一个程序来充当 REPL比如说 scala repl)和用户。换句话说,用户应该键入命令,而不是直接进入 REPL 执行,而是将它们传递给程序,然后程序在进行一些编辑后将其返回给 REPL 执行,显示答案等等开。

到目前为止,我得到的是一个简单的界面,使用scala.tools.jline.console.ConsoleReader 来显示提示,获取用户输入并在调用get_edited_data后显示结果

我也知道调用“scala”.!ProcessIO,但没有成功。

import java.io.PrintWriter
import scala.sys.process._
import scala.tools.jline.console.ConsoleReader

object Interfere {

  def main(args: Array[String]) {

    val repl = "scala"
    val console = new ConsoleReader
    val prompt = "prompt> "
    console.setPrompt(prompt)
    val out = new PrintWriter(
      console.getTerminal.wrapOutIfNeeded(System.out)
    )
    var line = console.readLine
    while (!line.equals("bye")) {
      val res = get_edited_data(line)
      out.println(s"The answer: $res")
      out.flush()
      line = console.readLine
    }
  }
}

我对 ProcessIO 所做的事情如下所示。但这没有意义,因为不可能将当前行作为输入,并且通常可以访问给它的内容。

Process(repl).run(
      new ProcessIO(
        stdin => line,
        stdout => out,
        stderr => out
      )
    )

【问题讨论】:

    标签: java scala system-calls


    【解决方案1】:

    我最近有类似的问题。后来我使用 java.lang.Process 来处理输入和输出。

    更好的选择是使用scala.tools.nsc.interpreter.ILoopscala.tools.nsc.interpreter.IMain 来构建您的REPL,而不是创建另一个进程。

    here 是 ILoop 的一个示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多