2016-02-12 4 views
0

То, что я пытаюсь сделать, это создать программу, чтобы выступать в качестве ходатая между РЕПЛ (позволяет сказать SCALA Repl) и пользователя. Другими словами, пользователь должен вводить команды, которые вместо того, чтобы напрямую обращаться к REPL для выполнения, передаются в программу, а затем программа после выполнения некоторого редактирования возвращает его в REPL для выполнения, показывает ответ и так далее. на.Взаимодействие между РЕПЛ и программой

То, что я получил до сих пор является простой интерфейс, с помощью scala.tools.jline.console.ConsoleReader, чтобы показать подсказку, получить пользовательский ввод и показать результаты после вызова get_edited_data

Я также знаю, что называть «Скала».! < делает работу совершенно красиво самостоятельно. То, что я не могу обмануть, - это как их подключить. Я уже пробовал использовать 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 
    ) 
    ) 

ответ

0

У меня есть аналогичная проблема в последнее время. Позже я использую java.lang.Process для обработки ввода и вывода.

Лучшим выбором является использование scala.tools.nsc.interpreter.ILoop или scala.tools.nsc.interpreter.IMain для создания вашего REPL вместо создания другого процесса.

here является примером для ILoop.

Смежные вопросы