一.本章要点

  • 延续让你可以回到程序执行当中之前的某个点;
  • 可以在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学习二十二——定界延续的更多相关文章

  1. scala 学习笔记十二 继承

    1.介绍 继承是面向对象的概念,用于代码的可重用性.可以通过使用extends关键字来实现继承. 为了实现继承,一个类必须扩展到其他类,被扩展类称为超类或父类.扩展的类称为派生类或子类. Scala支 ...

  2. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  3. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  4. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  5. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  6. 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环

    目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...

  7. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  8. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  9. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  10. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

随机推荐

  1. Ubuntu系统图形化界面无法登录到root用户的解决方法

    Ubuntu默认是禁用了root用户的登录. 系统安装后, 图形化界面无法登录到root用户解决方法:Ubuntu 12.04:1.设置root用户密码:  普通用户登录,sudo passwd ro ...

  2. arcgis python 把多个MXD批量导出一个PDF

    # -*- coding: cp936 -*- import arcpy, os, string #Read input parameters from script tool mxdList = s ...

  3. android: Android 权限管理小结

    一. 概述 感谢郭神,自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有 ...

  4. Sublime Text 编译运行Kotlin

    Sublime Text 编译运行Kotlin 转 https://blog.csdn.net/pirate7777777/article/details/72655293 kotlin最近是火了,所 ...

  5. Eclipse的视窗

    PackageExplorer 显示项目结构,包,类,及资源 Outline 显示类的结构,方便查找,识别,修改 Console 程序运行的结果在该窗口显示 Hierarchy 显示Java继承层次结 ...

  6. smarty里通过循环section嵌套结合IF语句实现工程进度显示

    <ul class="site_ul"> <{section name=constructionlist loop=$ly}> <li class=& ...

  7. C++ STL Heap算法

    #include <iostream>#include <algorithm>#include <vector> using namespace std; int ...

  8. ckpt convert to pb

    import tensorflow as tf #from create_tf_record import * from tensorflow.python.framework import grap ...

  9. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_04-freemarker基础-基础语法种类

    注释 编译一些这个模板 我的IDEA里面,是重新编译 刷新页面 注释.插值.FTL.文本

  10. 关于react中遇到的问题记录说明

    5.el表达式 dataSource = (userPage, orgList) => userPage.map(item => { const org = orgList.find(or ...