Question

I try building the following simple Generator using the Scala 2.8 Continuations-PlugIn. Where does the following error come from?

None/None/Some((Unit,Unit))
GenTest.scala:8: error: found cps expression in non-cps position
        yieldValue(1)

None/None/Some((Unit,Unit))
GenTest.scala:9: error: found cps expression in non-cps position
        yieldValue(2)

None/None/Some((Unit,Unit))
GenTest.scala:10: error: found cps expression in non-cps position
        yieldValue(3)

Code:

import scala.util.continuations._

object GenTest {

    val gen = new Generator1[Int] {
        yieldValue(1)
        yieldValue(2)
        yieldValue(3)
    }

    def main(args: Array[String]): Unit = {
        for (v <- gen) {
            println(v)
        }
    }
}



class Generator1[E](gen: => Unit @cps[Unit]) {

  var loop: (E => Unit) = null

  def foreach(f: => (E => Unit)): Unit = {
        loop = f
        reset[Unit,Unit]( gen )
  }

  def yieldValue(value: E): Unit @cps[Unit] =
    shift { genK: (Unit => Unit) =>
      loop( value )
      genK( () )
      ()
    }
}
Was it helpful?

Solution

Those yieldValue calls are happening inside gen's constructor, which is not allowed (I assume). Ah, I just noticed you intended them to be the constructor parameter. Well, unfortunately, that syntax only works with methods. I'm not sure you don't get another error as well here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top