Scala Continuations:Suspend without wait/sleep()

Scala Continuations:Suspend without wait/sleep(),scala,continuations,Scala,Continuations,好吧,我准备放弃了 我想保存延续的状态(使用shift完成)。 但是,需要注意的是,不应执行重置后的代码。考虑继续由工作者线程执行,并且不应该被处理。该延续保存在可恢复的全局延续列表中,其他所有延续都将被忽略且不应执行 工作线程必须存活(不能中止,也不能在需要旋转新线程的情况下销毁) 应该让步 1 恢复延续应该会产生效果 3 2 目前,这似乎根本不可能,因为继续操作仅限于重置的范围。但我想我会尝试一下 编辑:基本上。。。(也许我应该把它放在前面)我想调用一个方法,并暂停执行,直到它准备好

好吧,我准备放弃了

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

工作线程必须存活(不能中止,也不能在需要旋转新线程的情况下销毁)

应该让步

1
恢复延续应该会产生效果

3
2

目前,这似乎根本不可能,因为继续操作仅限于重置的范围。但我想我会尝试一下



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

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

  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
-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
-1
0
1
2
3
4
...

嗯,我认为这是不可能的,但扩大重置范围有什么问题?您知道cpsParam注释吗,它允许在方法内部使用shift,而该方法根本没有重置,所以当对该方法的调用出现在某个重置中时,它将以预期的方式工作?您也可以使用嵌套重置。我可以扩展重置范围,但重置中编写的代码将由第三方完成,因此我无法控制代码,放置@cpsParam可能不可行/不方便。我觉得这将我推向了正确的方向。但是,是否绝对有必要将@cpsParam放在调用堆栈中的所有方法上?会有更方便的方法吗?只有那些包含裸移位或其他方法的方法,注释如下。它是静态类型化所必需的——否则编译器无法知道您的移位控制流将以哪种类型结束,并且是cps转换所必需的——否则编译器不会以连续传递样式转换方法。但您通常可以完全避免编写返回类型,并且类型推断将通过正确的注释得到它。我在这方面没有取得太大的进展,事实上,对于我正在尝试的内容,似乎没有一个现有的解决方案,所以我将其搁置。无论如何,谢谢你的回答。