2012-12-16 34 views
0

好吧,我准备放弃这一点。斯卡拉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一个裂缝。


编辑:基本上......(也许我应该把这个更早)我想调用一个方法,并暂停执行,直到它准备给我一个结果,我想了一个实现这一偶数循环,而不是线程同步。

+0

嗯,我认为这是不可能的这种方式,但什么是延长复位范围的问题吗?你知道cpsParam注释,它允许使用shift内部方法,它根本没有重置,所以当调用这个方法出现在一些重置内部时,它会工作在预期的方式吗?你也可以使用嵌套重置。 – aemxdp

+0

我可以扩展重置范围,但在重置期间写入的代码将由第三方完成,因此我无法控制代码,并且将@cpsParam设置为不可行/方便。 –

回答

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 

这里是如果你不WA做什么NT暂停通话到f之后一切,直到复位的结局:

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

    println("...") 

打印:

-1 
0 
1 
2 
3 
4 
... 
+0

我觉得这让我走向正确的方向。 是否有必要将@cpsParam放在调用堆栈的所有方法上?会有更方便的方法吗? –

+0

只有那些包含裸体转换或其他方法的注释才是这样的。它需要静态类型 - 否则编译器无法知道您的移位控制流将以哪种类型结束,并且需要进行cps转换 - 否则编译器不会在继续传递样式中转换方法。但是你通常可以避免编写返回类型,并且类型推断会得到正确的注释。 – aemxdp

+0

嗯,我还没有取得很大的进展,事实上似乎并没有一个现有的解决方案,因为我正在尝试所以我搁置它。无论如何感谢您的答案。 –