【问题标题】:Scala delimited continuations error at runtimeScala在运行时分隔延续错误
【发布时间】:2011-08-29 06:18:58
【问题描述】:

这里是 Scala 新手,我刚刚下载了 Eclipse 3.6.2 和 Scala IDE 2.0.0-beta4(带有 Scala 2.9.0.final)。我创建了一个新的 Scala 项目来尝试分隔延续:

package delimCCTests

import scala.util.continuations._

object Test extends App {
  val result = reset {
    1 + shift { k: (Int => Int) => k(k(5)) } + 1
  }
  println(result)
}

这编译得很好,然后我点击 Run as -> Scala application 并得到这个异常:

Exception in thread "main" java.lang.NoSuchMethodError: scala.util.continuations.package$.shift(Lscala/Function1;)Ljava/lang/Object;
    at delimCCTests.Test$$anonfun$1.apply$mcI$sp(DelimCCTests.scala:7)
    at delimCCTests.Test$$anonfun$1.apply(DelimCCTests.scala:7)
    at delimCCTests.Test$$anonfun$1.apply(DelimCCTests.scala:7)
    at scala.util.continuations.package$.reset(package.scala:20)
    at delimCCTests.Test$delayedInit$body.apply(DelimCCTests.scala:6)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:60)
    at scala.App$$anonfun$main$1.apply(App.scala:60)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:45)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30)
    at scala.App$class.main(App.scala:60)
    at delimCCTests.Test$.main(DelimCCTests.scala:5)
    at delimCCTests.Test.main(DelimCCTests.scala)

我做错了什么?我是否缺少一些配置?

顺便说一句,我认为编译器推断出延续的类型? This article 使用:

val result = reset {
   1 + shift { k => k(k(5)) } + 1                   
}

但这在我的环境中无法编译...

【问题讨论】:

  • 那么编译环境和运行时环境有什么变化呢? :-) 我的第一个嫌疑人是正在使用的冲突(意外和不同)Scala 运行时库。
  • @pst:看起来确实是这样,但我之前从来没有在这个盒子里装过 Scala,所以不会是版本不匹配吧?
  • 在 REPL 上尝试了此代码,结果相同(Scala 版本 2.9.0.final(Java HotSpot(TM) 64 位服务器 VM,Java 1.6.0_25)在 Windows 7 64 位上)
  • 最终,我无法使用 Eclipse 完成这项工作,但 IDEA 完美运行。

标签: scala continuations delimited-continuations


【解决方案1】:

这个错误意味着您没有添加 Scala CPS 插件 - 它不是标准程序集的一部分(到目前为止)。将 the jar 放在类路径中,然后运行 ​​Scala,以便启用延续:

$ scala -P:continuations:enable

【讨论】:

  • 不,我按照stackoverflow.com/questions/4556540/… 中的说明进行操作,但出现编译时错误:“错误选项:-P:continuations:enable”
  • 还有,怎么找到reset,却找不到shift
  • "bad option: -P:continuations:enable" - 这个错误意味着你在类路径中没有continuations.jar
  • “另外,它怎么会发现重置而不是移位”~> 因为延续的接口方法是标准编译器分发的一部分(并且只有实现,插件本身,才能进行转换,分开)
  • @Vasil:谢谢,我将 continuations.jar 添加到类路径中,现在 continuations:enable 工作正常。但是我在运行时仍然遇到该错误......是的,我确保我的代码已重建:)
【解决方案2】:

这可以在 Eclipse 中通过在 Scala Compiler > Advanced 部分添加 CPS 插件类以及启用开关来解决:

Xplugin 应该是scala.tools.selectivecps.SelectiveCPSPluginXpluginsdir 应该是包含org.scala-lang.plugins.scala-continuations-plugin.jar 的目录

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 2011-08-25
    • 2014-01-08
    • 2011-05-11
    • 2019-05-31
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多