Scala Continuations:无需等待/睡眠暂停()

时间:2012-12-16 18:31:33

标签: scala continuations

好吧,我只是准备放弃这个。

我想保存延续状态(使用shift完成)。 但是,需要注意的是,重置后的代码不应该执行。考虑工作线程正在执行的继续,不应再处理。延续保存在可以恢复的全局延续列表中,其后的所有其他内容都被忽略,不应该执行。

工作线程必须存活(不能中止或破坏,需要旋转新线程)。

reset {
  shift {
    (cont:Unit=>Unit) =>
      println(1)
      suspend() // how would I implement something like this?
      cont()
  }

  println(3)
}

println(2)

应该产生

1

恢复继续应该产生

3
2

目前这似乎根本不可能,因为延续仅限于重置的范围。但我想我会给StackOverflow一个裂缝。


编辑:基本上......(也许我应该先把它放进去)我想调用一个方法,暂停执行直到它准备好给我一个结果,我想在一个事件循环中实现这个,而不是线程同步。

1 个答案:

答案 0 :(得分:1)

我不确定,这是否适用于您的情况,但这里是如何混合多次重置的示例:

  type Proc = Unit => Unit

  val resume = reset {
    shift { k1: Proc =>
      reset {
        shift { k2: Proc =>
          println(1)
          () => k2(); k1() 
        }        
        println(3)
      }
    }
    println(2)
  }
  // 1

  resume()
  // 3
  // 2

更新: 以下是如何使用方法:

  def f(): Unit @cpsParam[Unit, () => Unit] = {
    println(0)

    shift { k1: Proc =>
      reset {
        shift { k2: Proc =>
          println(1)
          () => k2(); k1()
        }        
        println(2)
      }
    }

    println(3)
  }

  val continue = reset {
    println(-1)
    f()
    println(4)
  }

  println("...")

  continue()

打印:

-1
0
1
...
2
3
4

如果您不想在调用f之后暂停所有内容,直到重置结束,该怎么办:

  reset {
    println(-1)
    shift { k: Proc =>
      reset{f()}()
      k()
    }
    println(4)
  }

  println("...")

打印:

-1
0
1
2
3
4
...