0

好吧,我正准备放弃这个。

我想保存延续的状态(使用 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 一个破解它。


编辑:基本上......(也许我应该早点说)我想调用一个方法,并暂停执行,直到它准备好给我一个结果,我想通过事件循环来实现这一点,而不是线程同步。

4

1 回答 1

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
...
于 2012-12-16T19:22:16.153 回答