Racket 模拟SICP的流(延时计算)
默认的Racket是要对函数参数进行求值的, 例如(f 1 (+ 1 2))里面,(+ 1 2)要先求值为3,变为(f 1 3)再进行下一步操作.因此, Racket若按照SICP使用define关键字来定义延时计算的关键函数delay和cons-stream是不可行的, 需要用宏来定义,绕过求值.
#lang racket (define (memo-proc proc)
(let ((already-run? #f) (result #f))
(lambda ()
(if already-run?
result
(begin (set! result (proc))
(set! already-run? #t)
result))))) (define-syntax-rule (delay exp)
(memo-proc (lambda () exp))) (define-syntax-rule (cons-stream a b)
(cons a (delay b)))
这里memo-proc是用于避免重复计算延时过程的. 比如首次调用延时过程(+ 1 2 3), 我们得到了结果6, 那么如果还需要反复调用它1万次, 显然再进行1万次(+ 1 2 3)的计算是不明智的,只需记住首次的结果, 以后再被调用时直接用它就可以了. 但这也说明了延时过程需要是无副作用的.
下面是其他延时函数的定义:
(define-syntax-rule (force delayed-object)
(delayed-object)) (define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream))) (define (stream-ref s n)
(if (= n )
(stream-car s)
(stream-ref (stream-cdr s) (- n )))) (define (stream-map proc s)
(if (null? s)
'()
(cons-stream (proc (stream-car s))
(stream-map proc (stream-cdr s))))) (define (stream-for-each proc s)
(if (null? s)
'done
(begin (proc (stream-car s))
(stream-for-each proc (stream-cdr s))))) (define (stream-enumerate-interval low high)
(if (> low high)
'()
(cons-stream
low
(stream-enumerate-interval (+ low ) high)))) (define (display-line x)
(newline)
(display x)) (define (display-stream s)
(stream-for-each display-line s)) (define (show x)
(display-line x)
x) ; test begins... (define x (stream-map show (stream-enumerate-interval )))
(stream-ref x )
(stream-ref x )
感慨: 其实我这里的宏只是相对于C语言里的那种文本替换宏. Racket的宏还能更加复杂. Scheme系语言的表达能力确实强悍, 但或许不太适合团队. 一是S表达式的形式繁琐, 语法简单优雅的代价就是视觉上的反人类,不利于交流. 二是这种语言可定制性太强, 你喜欢这样搞, 我还喜欢那样搞呢, 谁愿去理解你那些说不定你自己过段时间都理解不了的各种宏或延续的奇技淫巧呢. 此时对比Python, 其设计者的良苦用心可见一斑.
Racket 模拟SICP的流(延时计算)的更多相关文章
- 流式计算(二)-Kafka Stream
前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...
- Others-阿里专家强琦:流式计算的系统设计和实现
阿里专家强琦:流式计算的系统设计和实现 更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 阿里云数据事业部强琦为大家带来题为“流式计算的系统设计与实现”的演讲,本 ...
- 流式计算(三)-Flink Stream 篇一
原创文章,谢绝任何形式转载,否则追究法律责任! 流的世界,有点乱,群雄逐鹿,流实在太多,看完这个马上又冒出一个,也不知哪个才是真正的牛,据说Flink是位重量级选手,能流计算,还能批处理, 和其他伙 ...
- Java的lamda表达式/函数式接口/流式计算
在我们看他人code的时候经常会看到,可能会经常看到lambda表达式,函数式接口,以及流式计算.在刚接触这些新功能时,也觉得真的有必要吗?但是现在写多了,发现这个功能确实能简化代码结构,提升编码效率 ...
- 搜索广告与广告网络Demand技术-流式计算平台
流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...
- 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15
上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...
- Apache Beam—透视Google统一流式计算的野心
Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...
- kafka 流式计算
http://www.infoq.com/cn/articles/kafka-analysis-part-7/ Kafka设计解析(七)- 流式计算的新贵 Kafka Stream
- [原创] 如何PCB通流能力计算
一.计算方法如下: 先计算Track的截面积,大部分PCB的铜箔厚度为35um(不确定的话可以问PCB厂家)它乘上线宽就是截面积,注意换算成平方毫米. 有一个电流密度经验值,为15~25安培/平方毫米 ...
随机推荐
- C#之冒泡排序
以前在学校的时候看过冒泡排序,看的时候挺明白的,但是自己写的时候就写不出来,在网上搜索了一下,发现网上的冒泡排序算法几乎都不符合冒泡排序的原理,虽然也能实现,但是不正宗. 冒泡排序从字面意思理解:应该 ...
- CentOS下安装yum
在Linux里面依次输入下面的命令: 1,下载最新的yum-3.2.28.tar.gz并解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.t ...
- [LeetCode] 4 Keys Keyboard 四键的键盘
Imagine you have a special keyboard with the following keys: Key 1: (A): Print one 'A' on screen. Ke ...
- mysql 免安装与 忘记root密码 密码过期
免安装: 参考 :https://blog.csdn.net/werwqerwerwer/article/details/52919939 注:别忘了配置环境变量 忘记root密码解决办法: 1. ...
- [BZOJ 4361]isn
Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...
- [SCOI 2016]幸运数字
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- [TJOI2017]异或和
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的 简单.但今天小明遇到了一个序列和的难题,这个题目不 ...
- ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)
●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...
- poj 2104 主席树(区间第k大)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44940 Accepted: 14946 Ca ...
- CentOS 7 安装MySQL 5.6遇到问题及解决方案
centos下安装mysql真的没有想象中那么容易,在这里我总结一下遇到的问题 1. ERROR 2002 (HY000): Can’t connect to local MySQL server t ...