关于sicp stream流的相关思考

博客围绕SICP流展开,探讨其性质及与惰性求值的关系。介绍了惰性求值中delay和force的实现方法,指出它们相互定义是为抽象出时间关系。还思考了改变cons定义带来的能力变化,以及不同场景下惰性求值的差异,并提出在其他程序实现惰性求值的思考。

SICP-STREAM

关于流所具有的性质以及它和惰性求值的关系。



什么可以代替惰性求值

惰性求值提到了delay 和force,它们的实现方法也比较简单,无非就是把函数求值的那个瞬间,用lambda表达式标记了,然后让force来触发即可。
它的引申意义是非常有趣的。
它是在数据本身要做的事情功能之上,又提升了一层,这个提升的意义概括了所有的数据。这个提示的维度实在是有点有趣。我努力说清楚。
比如
SICP中文书上p62的那个

(define (cons x y) 
(lambda (m) (m x y)))

(define (car b) 
(b (lambda (x y)) x)))

这里的cons和car几乎是靠它们对对方的意义来形成自己的,cons和car的实体的意义是不存在。程序的本质是交互和沟通,除去了额外的数据以外,它的组件之间的关系应该就是反映这种交互和沟通的。

上述说法完完全全扯远了。
我想说的意思是,流的force和delay也和car 和cons 后面的函数一样,是两个洞,两个相互关联的关系,而这个关系是由时间去填充的。
可以说,如果说car 和cons之间的互相定义是为了抽象出它们之间的关系,那么force和delay之间的相互定义,是为了抽象出时间与它们之间的关系。但就像前者的关系是模式匹配着去处理数据一样,后者也仅仅是在流这个形式中去想象时间的可能。

再者,思考这个有关时间的抽象,具有的强力是怎样的?如果我们把cons定义为有赋值概念的(p179),它就有了更改状态的能力,整一个程序变成了指针的控制的技巧。
同理,如果我们把cons定义为有流和时间控制概念的,它具备了怎样的能力呢?是无限的能力吗?整个程序设计的重心又在那里了呢?

程序的需求大致可以分为两种,一种是数据处理,一种是逻辑处理。计算则是上述两者通用的技巧,在前者那里是模式设计的技术,在后者那里是语言归纳的技术。惰性求值的改变,改变的似乎就是计算?

那我再问,在Lisp中带来的惰性求值上的连同它的数据表结构的变化,和我只是借用了惰性求值的技巧,在任何一个支持函数式编程的程序里调用lambda或者闭包或者cps来延迟求值之间的变化,这两者之间到底差异在哪里呢?假设我要做一个游戏……它们的画面表现是可以完全相等的吗?(这个假设肯定要找个合适的题材进行下去……)

假设我要在其他程序中实现这个惰性求值。我会这样思考,它们是不是一个生成器呢?
比如我有一个函数a ,我每次调用它,它就会产生一个值,这个值在函数内部是有状态的,每次调用时候会增加1。这样它在表面上好像和force有点像?假设我有一个机器,准备调用这个函数,每次都调用……,然后把调用得来的结果也进行过滤处理,如果不符合要求就重新调用函数。

好了,不成熟的思考就在这里。提出了很多问题,期待以后能自己慢慢回答。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值