Scala学习二十二——定界延续
一.本章要点
- 延续让你可以回到程序执行当中之前的某个点;
- 可以在shift块中捕获延续
- 延续函数一直延展到包含它的reset块的尾部
- 延续所谓的”余下的运算“,从包含shift的表达式开始,到包含它的reset块的尾部结束,其中shift替换成一个”洞“
- 当你传入一个参数来调用延续时,这个”洞“将传入的参数值填上
- 包含shift表达式的代码将被以”延续传递风格“(CPS)重写,直到包含该延续的reset为止
- 包含shift但没有reset的方法必须加上CPS注解
- 延续可以用来将对某个树形结构的递归访问变成迭代
- 延续可以在Web或GUI应用中撤销”控制反转“
二.捕获并执行延续
延续是一种让你回到程序之前的一个点的一种机制。使用shift结构:
//这里的延续是一个不带参数也不带返回值的函数
执行延续即简单调用cont就跳回shift中那一点
var cont:(Unit=>Unit)=null
...
shift{k:(Unit=>Unit)=>//延续被传递给了shift
cont=k //保存下来,以便以后使用
}
//在Scala中,延续是定界的——只能延续到指定的边界,这个边界由reset{...}标出,调用cont时,执行从shift开始,一直延展到reset块的边界
reset{
...
shift{
k:(Unit=>Unit)=>cont=k
}//对cont的调用将从这儿开始
}//...结束
完整读取文件的例子:

三.”运算当中挖个洞“
延续捕获了什么:把shift块想象成一个位于reset块中的洞。当执行延续时,可以将一个值传入到这个洞中,运算继续,就像shift本就是那个值。。。
四.reset和shift的控制流传
双重职责——定义延续职责和捕获延续函数。
调用reset,代码体开始执行,执行遇到shift,shift的代码体被调用,传入延续参数作为参数,当shift执行完成,执行立即跳转到包含延续的reset末尾。。。
五.reset表达式的值
如果reset块退出是因为执行了shift,那么得到的值就是shift块的值;如果reset块执行到自己的末尾的话,值就是reset的值(块中最后一个表达式的值);在实际操作,如果reset代码块包含分支或循环,两种情况都可能。
六.reset和shift表达式的类型
reset和shift都是带有类型参数的方法。。。
七.CPS注解
某些虚拟机延续的实现方式是抓取运行期栈的快照。当有人调用延续时,运行期栈被恢复成快照的样子(Java虚拟机不允许对栈进行操作)。
为了在JVM提供延续,Scala对reset块中的代码进行”延续风格“(CPS)的变换。
八.将递归访问转化为迭代
reset和shift方法适合控制流转的模式。每当shift被执行,程序就退出包含它的reset。当被捕获的延续中被调用时,程序又返回shift的位置。。。
九.撤销控制反转
。。。
十.CPS变换
。。。
十一.转换嵌套的控制上下文
。。。
十二.练习


Scala学习二十二——定界延续的更多相关文章
- scala 学习笔记十二 继承
1.介绍 继承是面向对象的概念,用于代码的可重用性.可以通过使用extends关键字来实现继承. 为了实现继承,一个类必须扩展到其他类,被扩展类称为超类或父类.扩展的类称为派生类或子类. Scala支 ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Tensorflow深度学习之十二:基础图像处理之二
Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像: ...
- 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环
目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...
- (C/C++学习笔记) 二十二. 标准模板库
二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池
VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...
随机推荐
- Ubuntu系统图形化界面无法登录到root用户的解决方法
Ubuntu默认是禁用了root用户的登录. 系统安装后, 图形化界面无法登录到root用户解决方法:Ubuntu 12.04:1.设置root用户密码: 普通用户登录,sudo passwd ro ...
- Vue 目录
什么是 vue-cli 通过 vue-cli 建立出来的 vue
- tp中打印sql,查看语句信息
$a = self::where($where)->fetchSql(true)->select(); dump($a);
- (八)爬虫之js调试(登陆知乎)
上次爬取网易云音乐,折腾js调试了好久,难受....今天继续练练手,研究下知乎登陆,让痛苦更猛烈些. 1.简单分析 很容易就发现登陆的url=“https://www.zhihu.com/api/v3 ...
- 011-通过网络协议解析网络请求-DNS-ARP-TCPIP
一.概述 1.1.tcp/ip概述 TCP/IP不是一个协议,而是一个协议族的统称.里面包括IP协议.IMCP协议.TCP协议.跨越了多层模型的多层 TCP/IP协议族按照层次由上到下,层层包装.最上 ...
- php微信支付企业付款到零钱报错call faild, errorCode:58
这个报错一般是自己证书目录不是绝对目录,正确的目录结构应该是网站根目录下的:“C:\PHPWAMP_IN1\wwwroot\XXXX\XXXX.pem”. 还要注意的是文件夹命名一定 ...
- python进阶--多线程多进程
一.线程和进程 进程是拥有独立内存,能够独立运行的最小单位,也是程序执行的最小单位,线程是程序运行过程中,一个单一的顺序控制流程,是程序执行流的最小单位,一个进程至少包含一个线程,多线程共享进程的内存 ...
- Unity3d NavMeshAgent 寻路问题(1)
navMeshAgent调用setDestination 后,会有一个计算路径的时间,计算过程中pathPending为true. 在这个过程中remainingDistance一直为0.
- webdriervAPI(控制浏览器及简单元素操作)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- 联想拯救者电脑装Ubuntu没有WIFI
最近给联想电脑装Ubuntu系统,但是装完之后总是无法启动WIFI,而宽带上网却可以,给出一个解决办法,但是该办法应该只适合联想电脑,其他电脑请自测! 打开终端,输入下面指令: sudo modpro ...