2013-06-20 3 views
2

Я изучаю Scala.React и обновленный paper on the issue, пытаясь получить простой пример на основе Signal.Запуск простого выражения Scala.React

Я понимаю, что метод Signal в документе не существует, но вместо этого есть Strict и Lazy. Так что мой наивный первая попытка:

Настройка целиком:

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 
    [email protected] 
    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$ 
+0

Мне очень хотелось бы получить реактивное программирование, но у меня сложилось впечатление, что Scala.React больше не поддерживается. Поэтому я очень неохотно его использую. – Madoc

+0

У меня такая же проблема при получении простого примера выполнения, см. [Простой пример для Scala React] (http://stackoverflow.com/questions/19386516/simple-example-for-scala-react) –

+1

@Madoc Да, я не стал бы делать ставку на производство, я просто пытался это сделать. Насколько я знаю, плагин компилятора CPS будет оставлен. Вероятно, лучше всего ждать, пока Халлер/Миллер опубликует исходный код [RAY] (http://infoscience.epfl.ch/record/188383/) –

ответ

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() 
}