【问题标题】:Running a simple Scala.React expression运行一个简单的 Scala.React 表达式
【发布时间】:2013-06-20 15:12:35
【问题描述】:

我正在研究Scala.React 和更新的paper on the issue,试图让一个简单的基于Signal 的示例工作。

据我了解,论文中的Signal方法并不存在,而是有StrictLazy。所以我天真的第一次尝试:

设置整个事情:

object dom extends scala.react.Domain {
  val engine    = new Engine
  val scheduler = new ManualScheduler
}
import dom._

尝试组合:

val v1, v2 = Var(0)

val f = Strict { v1() + v2() }

第二行崩溃

java.lang.AssertionError: assertion failed: This method must be run on its domain
  scala.react.NilDebug@4eaf6cb1
    at scala.Predef$.assert(Predef.scala:179)
    at scala.react.Debug.assertInTurn(Debug.scala:37)
    at scala.react.EngineModule$Propagator.defer(EngineModule.scala:120)
        ...

所以我一定做错了什么。但是什么?


第二次尝试:

scala> dom.start()

scala> var v1, v2, f = (null: Signal[Int])
v1: dom.Signal[Int] = null
v2: dom.Signal[Int] = null
f: dom.Signal[Int] = null

scala> schedule { v1 = Var(0); v2 = Var(0) }

scala> schedule { f = Strict { v1() + v2() }}

scala> engine.runTurn()

scala> schedule { println(f.now) }

scala> engine.runTurn()
Uncaught exception in turn!
scala.react.EngineModule$LevelMismatch$

【问题讨论】:

  • 我很想进入响应式编程,但我的印象是 Scala.React 不再维护了。所以,我很舍不得用。
  • 我在运行一个简单的示例时遇到了同样的问题,请参阅Simple Example for Scala React
  • @Madoc 是的,我不会赌它用于生产,我只是在尝试。据我所知,CPS 编译器插件也将被放弃。可能最好等 Haller/Miller 发布RAY的源代码
  • @0__ 感谢您的提示!

标签: scala reactive-programming


【解决方案1】:

好的,所以首先我们应该使用Lazy 而不是Strict,如果我们想保留对这些信号的引用,因为Strict 需要在预定的回合内运行。

以下是我的新尝试。不确定这是否是它的意图,但它有效:

object Test extends scala.react.Domain with App {
  val engine    = new Engine
  val scheduler = new ManualScheduler

  val v2   = Var(0)
  val v1   = Lazy { v2() + 10 }
  val f    = Lazy { v1() + v2() }

  start()

  schedule {
    new Observing {
      observe(f) { p =>
        println(s"Observed: $p")
      }
    }
    v2() = 5
  }

  runTurn()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 2013-10-22
    • 2016-10-11
    • 2011-03-23
    • 1970-01-01
    • 2012-12-31
    • 2011-02-28
    相关资源
    最近更新 更多