2.10的嵌入式Scala REPL解释器示例

Ben*_*son 17 scala read-eval-print-loop

请提供一个代码示例,说明如何以编程方式创建嵌入式Scala REPL解释器,该解释器适用于Scala 2.10.(我花了几个小时梳理各种代码片段以获得一个有效的口译员后,我添加了这个问答)

Ben*_*son 23

示例Repl.scala:

import scala.tools.nsc.interpreter._
import scala.tools.nsc.Settings


object Repl extends App {
  def repl = new ILoop {
    override def loop(): Unit = {
      intp.bind("e", "Double", 2.71828)
      super.loop()
    }
  }

  val settings = new Settings
  settings.Yreplsync.value = true


  //use when launching normally outside SBT
  settings.usejavacp.value = true      

  //an alternative to 'usejavacp' setting, when launching from within SBT
  //settings.embeddedDefaults[Repl.type]

  repl.process(settings)
}
Run Code Online (Sandbox Code Playgroud)

一些笔记

  • 我选择显示JLineReader(默认)而不是SimpleReader因为它工作得更好,正确处理箭头键,删除等.JLine确实添加了jar依赖项.
  • 该示例显示了如何将值绑定到repl(e上面的变量).
  • 当我省略时settings.Yreplsync.value = true,REPL挂起并且没用.
  • 从我的测试中,如果将两者usejavacpembeddedDefaults设置组合在一起,则会产生错误

我觉得最容易通过SBT进行测试; 一个样本build.sbt:

name := "Repl"

organization := "ExamplesRUs"

scalaVersion := "2.10.2"

libraryDependencies ++= Seq(
 "org.scala-lang" % "scala-compiler" % "2.10.2",
 "org.scala-lang" % "jline" % "2.10.2"
)
Run Code Online (Sandbox Code Playgroud)

样本SBT会议:

> run-main Repl
[info] Running Repl
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37).
Type in expressions to have them evaluated.
Type :help for more information.
e: Double = 2.71828

scala> 2 * e
res1: Double = 5.43656

scala>
Run Code Online (Sandbox Code Playgroud)

  • 不能使用scala 2.11作为"方法循环不能覆盖最终方法" (5认同)
  • @ simbo1905对于2.11,请改写createInterpreter并在调用intp.bind之前调用super()。createInterpreter()。 (2认同)