注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

Scala 2.8预览:Continuation  

2009-07-21 18:31:23|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
英文原文由 rompf 发表于 2009年6月5日。

Scala 2.8将支持一种强大的逻辑流程抽象功能——continuation。它最牛逼之处在于允许你直接以逐语句风格使用基于回调、事件驱动的API。

这将能简化许多编程任务:

  • 使用Java NIO处理异步I/O
  • 使用Executor和线程池
  • 在Web应用中处理跨越多个请求的逻辑流程

在Scala 2.8中并不会专门为以上用例引入新的API。相反,我们期待,当底层的 Continuation 机制加入之时,你会自然而然的用上它。

 

概览Shift和Reset

Continuation可在某一时刻对程序进行“捕获”得到,它包含了这一时刻该程序的“其余部分”。Continuation有一点很有意思,它可以被视为普通的函数变量,比如你可以把它保存在数据结构中,然后再进行一次或多次调用(也可以根本不调用它)。Scala中的Continuation和 Schememe或ML中的不同,Scala中的Continuation具有隔离范围(即composable或delimited)。这意味着,它们并不包含程序的全部剩余部分,而只包含由程序员定义的范围内的剩余部分。

可以使用shiftreset两个基本方法操作Continuation。调用shift能捕获当前Continuation,而reset界定了Continuation能到达的边界。下面是一段示例:

reset {
...
shift { k: (Int=>Int) => // the continuation k will be the '_ + 1' below
k(7)
} + 1
}
// result: 8

当然,shiftreset是库函数,而不是新的关键字。从语法角度看,这二者亦无需同时出现。事实上,对shiftreset的使用中可以出现在完全无关的方法中。类型系统能确保不出差错,并要求每一个包含shift方法都在其返回类型标记了@cps类型注释(type annotation)。许多情况下,该类型注释会被自动推断,无须程序员过问。

def foo(): Int @cps[Int,Int] = { // could leave out return type
shift { k: (Int=>Int) =>
k(7)
} + 1
}
reset(2 * foo()) // result: 16

以下是另一示例,示范了如何在基于回调的API使用Continuation.

import java.util.{Timer,TimerTask}

val timer = new Timer()

def sleep(delay: Int) = shift { k: (Unit => Unit) =>
timer.schedule(new TimerTask {
def run() = k() // in a real program, we'd execute k on a thread pool
}, delay)
}

println("look, Ma ...")
sleep(1000)
println(" no threads!")


如果您想先睹为快,自己动手试试Scala编译器的Continuation插件预发布版吧(可从源代码版本库中获取)。若要了解Scala 2.8实现Continuation的相关细节,请看相应的文件 (ICFP'09中加入) 。

  评论这张
 
阅读(1492)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018