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 ...
随机推荐
- puppeteer注入cookie然后访问页面
var puppeteer = require('puppeteer'); const devices = require('puppeteer/DeviceDescriptors'); const ...
- arcgis python 随机取部分数据
# -*- coding: cp936 -*- import arcpy import os import ylpy import random def main(): num=ylpy.getCou ...
- LINUX 上 实现SNTP (时间同步)
Network Time Protocol (NTP) 也是RHCE新增的考试要求. 学习的时候也顺便复习了一下如何设置Linux的时间,现在拿出来和大家分享 设置NTP服务器不难但是NTP本身是一个 ...
- fcgi vs. gunicorn vs. uWSGI
fcgi vs. gunicorn vs. uWSGI - Peterbe.comhttps://www.peterbe.com/plog/fcgi-vs-gunicorn-vs-uwsgi uWSG ...
- Android 显示系统:飞思卡尔平台图形界面与GPU硬件加速
图形是Android平台中的一个大主题,包含java/jni图形框架和2d/3d图形引擎(skia.OpenGL-ES.renderscript). 本文档描述了飞思卡尔设备上的一般Android图形 ...
- Web Service 实例基于Socket创建Web服务
ServerSocket服务器端代码如下: public static void main(String[] args) throws IOException { // 1:建立服务器端的tcp so ...
- kettle的用法
一: 从一个数据库导入表的数据到另一个 数据库的表中(表数据同步) 1:在 主对象树-- DB连接 中新建 连接: 在选项中 设置字符集: 2: 在 核心对象中 先增加一个 表输入: 再增加一个 插 ...
- Python中elasticsearch插入和更新数据的实现方法
Python中elasticsearch插入和更新数据的实现方法 这篇文章主要介绍了Python中elasticsearch插入和更新数据的实现方法,需要的朋友可以参考下 首先,我的索引结构是酱紫的. ...
- npm install --save react-native-device-info报错
报错截图如下: 把react-native-device-info删了再添加还是这样,后面使用yarn就成功了. 然后发现会报错,这里估计是Xcode 9的bug,你只要确保以下显示就可以了.没有自己 ...
- Spring Cloud(5):服务路由(Zuul)
Zuul简介 所有微服务之间的调用,都应该通过服务网关进行路由,服务网关充当服务与服务之间的中介.服务网关像交通警察一样指挥交通,将用户引导到目标微服务实例.服务网关还充当着应用程序内所有微服务调用的 ...