scala - 自定义 Scala REPL 问题

标签 scala compiler-construction read-eval-print-loop

我正在尝试使用我在各个站点上找到的一些信息来编写一个基本的 Scala REPL。我最基本的 REPL 实现如下所示,

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

object BillyREPL extends App {
  val settings = new Settings
  settings.usejavacp.value = true
  settings.deprecation.value = true

  new ILoop().process(settings)
}

使用以下build设置,

import sbt._
import sbt.Keys._

object BillyREPLBuild extends Build {

  lazy val billyrepl = Project(
    id = "billyrepl",
    base = file("."),
    settings = Project.defaultSettings ++ Seq(
      name := "BillyREPL",
      organization := "tv.yobriefcasts",
      version := "0.1-SNAPSHOT",
      scalaVersion := "2.10.1",
      libraryDependencies ++= Seq(
        "org.scala-lang" % "scala-compiler" % "2.10.1",
        "org.scala-lang" % "scala-library" % "2.10.1"
      )
    )
  )
}

尝试运行它会导致一些警告和最终错误(我认为这是由初始警告引起的),

Welcome to Scala version 2.10.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_12-ea).
Type in expressions to have them evaluated.
Type :help for more information.

scala>
Failed to initialize compiler: object scala.annotation.Annotation in compiler mirror not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programatically, settings.usejavacp.value = true.

下面是尝试读取/评估任何内容时的错误。我不确定这是否是由于缺少一些额外的依赖项,我确实意识到错误消息表明这并不常见,但我想知道在我打开问题之前是否有人处理过这个问题?

2

Failed to initialize the REPL due to an unexpected error.
This is a bug, please, report it along with the error diagnostics printed below.
java.lang.NullPointerException
    at scala.tools.nsc.interpreter.ExprTyper$codeParser$.applyRule(ExprTyper.scala:24)
    at scala.tools.nsc.interpreter.ExprTyper$codeParser$.stmts(ExprTyper.scala:35)
    at scala.tools.nsc.interpreter.ExprTyper$$anonfun$parse$2.apply(ExprTyper.scala:43)
    at scala.tools.nsc.interpreter.ExprTyper$$anonfun$parse$2.apply(ExprTyper.scala:42)
    at scala.tools.nsc.reporters.Reporter.withIncompleteHandler(Reporter.scala:51)
    at scala.tools.nsc.interpreter.ExprTyper$class.parse(ExprTyper.scala:42)
    at scala.tools.nsc.interpreter.IMain$exprTyper$.parse(IMain.scala:1074)
    at scala.tools.nsc.interpreter.IMain.parse(IMain.scala:1078)
    at scala.tools.nsc.interpreter.IMain$$anonfun$showCodeIfDebugging$1.apply(IMain.scala:1168)
    at scala.tools.nsc.interpreter.IMain$$anonfun$showCodeIfDebugging$1.apply(IMain.scala:1168)
    at scala.tools.nsc.interpreter.IMain.beSilentDuring(IMain.scala:238)
    at scala.tools.nsc.interpreter.IMain.showCodeIfDebugging(IMain.scala:1168)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(IMain.scala:800)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(IMain.scala:761)
    at scala.tools.nsc.interpreter.IMain.bind(IMain.scala:618)
    at scala.tools.nsc.interpreter.IMain.bind(IMain.scala:661)
    at scala.tools.nsc.interpreter.IMain$$anonfun$quietBind$1.apply(IMain.scala:660)
    at scala.tools.nsc.interpreter.IMain$$anonfun$quietBind$1.apply(IMain.scala:660)
    at scala.tools.nsc.interpreter.IMain.beQuietDuring(IMain.scala:232)
    at scala.tools.nsc.interpreter.IMain.quietBind(IMain.scala:660)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$apply$mcZ$sp$2.apply$mcV$sp(ILoop.scala:838)
    at scala.tools.nsc.interpreter.ILoopInit$class.runThunks(ILoopInit.scala:122)
    at scala.tools.nsc.interpreter.ILoop.runThunks(ILoop.scala:42)
    at scala.tools.nsc.interpreter.ILoopInit$class.postInitialization(ILoopInit.scala:95)
    at scala.tools.nsc.interpreter.ILoop.postInitialization(ILoop.scala:42)
    at scala.tools.nsc.interpreter.ILoopInit$$anonfun$createAsyncListener$1.apply$mcV$sp(ILoopInit.scala:63)
    at scala.tools.nsc.interpreter.ILoopInit$$anonfun$createAsyncListener$1.apply(ILoopInit.scala:60)
    at scala.tools.nsc.interpreter.ILoopInit$$anonfun$createAsyncListener$1.apply(ILoopInit.scala:60)
    at scala.tools.nsc.io.package$$anon$3.call(package.scala:40)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
.

最佳答案

当您嵌入 REPL 并且项目使用 sbt 运行时会出现问题。由于类加载器问题(?),从 sbt 启动自定义解释器不起作用。

您可以尝试使用 sbt-assembly 构建一个独立的并查看它是否正确启动。

关于scala - 自定义 Scala REPL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16920884/

相关文章:

scala - 如何反转/翻转/反转/交换 scala 的选项?

multithreading - 让 Actor sleep

gcc - 如何编译混合的 C 和 C++ 代码?

c - 如何将非标准头文件链接到 C 编译器

java - 用于Scala开发的java8中的gradle REPL

python - ipython和python之间的输出差异

regex - Scala - 从字符串中去除除链接之外的所有 html 标签

scala - 如何恢复(垃圾收集)在 scala repl 中分配的内存?

c++ - MSVC 的虚方法崩溃

read-eval-print-loop - 如何创建 Perl 6 REPL 插件?