Есть ли хорошая библиотека для встраивания командной строки в приложение Scala (или Java) - PullRequest
3 голосов
/ 30 октября 2010

У меня есть приложение, в котором я хотел бы получить приглашение. Если это поможет, это реализация базы данных графа, и мне нужно приглашение, как и любой другой клиент базы данных (MySQL, Postgresql и т. Д.).

Пока у меня есть свой собственный REPL, например:

object App extends Application {
    REPL ! Read
}

object REPL extends Actor {
    def act() {
        loop {
            react {
                case Read => {
                    print("prompt> ")
                    var message = Console.readLine
                    this ! Eval(message)
                }
                case More(sofar) => {
                    //Eval didn't see a semicolon
                    print("    --> ")
                    var message = Console.readLine
                    this ! Eval(sofar + " " + message)
                }
                case Eval(message) => {
                    Evaluator ! Eval(message)
                }
                case Print(message) => {
                    println(message)
                    //And here's the loop
                    this ! Read
                }
                case Exit => {
                    exit()
                }
                case _ => {
                    println("App: How did we get here")
                }
            }
        }
    }
    this.start
}

Это работает, но мне бы очень хотелось иметь что-то с историей.Заполнение табуляции не требуется.

Есть предложения по хорошей библиотеке?Scala или Java работают.

Просто чтобы прояснить ситуацию, мне не нужен REPL для оценки моего кода (я получаю это с помощью scala!), И при этом я не пытаюсь вызывать или использовать что-то из командной строки.Я ищу подсказку, которая является моим пользовательским опытом при запуске моего клиентского приложения.

Ответы [ 3 ]

6 голосов
/ 30 октября 2010

Сама Scala и множество других программ используют библиотеку, похожую на readline , для своего REPL.В частности, JLine .

Я нашел еще один вопрос по этому поводу, ответы на который не кажутся многообещающими.

2 голосов
/ 30 октября 2010

BeanShell делает то, что вы хотите: http://www.beanshell.org/

0 голосов
/ 20 ноября 2015

Я понял.эти два блога действительно помогли.

http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html

http://danielwestheide.com/blog/2013/01/16/the-neophytes-guide-to-scala-part-9-promises-and-futures-in-practice.html

def interprete(code: String) : Future[String] = {
val p = Promise[String]()

Future {
  var result = reader.readLine()
  p.success(result)
}

writer.write(code + "\n")
writer.flush()

p.future

}

for (ln <- io.Source.stdin.getLines){
  val f = interprete(ln)
  f.onComplete {
    case Success(s) =>
      println("future returned: " + s)
    case Failure(ex) =>
      println(s"interpreter failed due to ${ex.getMessage}")
  }

}
...