其中每个计算对象有它自己的一些局部状态变量-Read.PPTVIP

其中每个计算对象有它自己的一些局部状态变量-Read.PPT

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
其中每个计算对象有它自己的一些局部状态变量-Read

模块化、对象和状态 前面我们介绍了组成程序的各种基本元素,并且看到了如何把基本过程和基本数据组合起来,构造出复合的实体,在此过程中我们认识到了抽象的重要作用。但是对于程序设计而言,这些手段还不够用。特别的,我们需要一些能够帮助我们构造起模块化的大型系统的策略。 这一章里,我们要研究两种特点很鲜明的组织策略,它们源于对于系统结构的两种非常不同的“世界观”。第一种策略将注意力集中在对象上,将一个大型系统看成一大批对象,它们的行为可能随着时间的进展而不断变化。另一种组织策略将注意力集中在流过系统的信息流上,非常像电子工程师观察一个信号处理系统。 赋值和局部状态 我们关于世界的常规观点之一,就是将它看作聚集在一起的许多独立对象,每个对象都有自己的随着时间变化的状态。所谓一个对象“有状态”,也就是说它的行为受到它的历史的影响。我们可以用一个或几个状态变量刻画一个对象的状态,在它们之中维持有关这一对象的历史,即能够确定该对象当前行为的充分的信息。 一个由许多对象组成的系统里,其中的这些对象极少会是完全独立的。每个对象都可能通过交互作用,影响其他对象的状态。如果一个系统中的状态变量可以分组,形成一些内部紧密结合的子系统,每个子系统与其他子系统之间只存在松散联系,此时将这个系统看作是由一些独立对象组成的观点就会特别有用。 要使一个计算模型成为模块化的,就必须能把它分解为一批能够模拟系统里的实际对象的计算对象,其中每个计算对象有它自己的一些局部状态变量。特别的,如果我们希望通过程序设计语言里常规的符号名字去模拟状态变量,那么语言里就必须提供一个赋值运算符,是我们能用它去改变与一个名字相关联的值。 赋值和局部状态 下面看一个银行帐户支取现金的例子: 我们用过程withdraw完成此对帐户的一次取款(假设帐户有金额100 ),它有一个参数amount表示支取现金量。如果给定的支取额在相应帐户尚有足额余款,那么返回支取后帐户的剩余款项,否则返回Insufficient funds (金额不足)的提示。如: (withdraw 25) ;: 75 (withdraw 25) ;: 50 (withdraw 60) ;: “Insufficient funds” (withdraw 15) ;: 35 可以看到withdraw 25求值了两次,但是产生了不同的结果。 赋值和局部状态 这种过程的新的行为方式,到目前为,我们还没有见到过。我们需要一些新的实现withdraw过程的方式。我们可以用一个变量balance表示帐户的现金余额,并且我们还要注意到balance应该只能有withdraw唯一直接访问,它只能是一个局部状态变量: (define withdraw (let ((balance 100)) (lambda (amount) (if (= balance amount) (begin (set! balance (- balance amount)) balance) Insufficient funds)))) 这里使用了特殊形式set!,其一般语法表示为: (set! name new-value) 这里name 应该是一个符号, new-value是任何表达式。Set!将修改name ,使它的值变成求值new-value得到的结果。 赋值和局部状态 过程withdraw里还使用了begin特殊形式,一般的,对表达式的求值: (begin exp1 exp2 … expk) 将导致表达式exp1到expk按顺序求值,最后expk的值将作为整个begin形式的返回值。 将set!与局部变量相结合,形成了一种具有一般性的程序设计技术,但采用这一技术也引起了一个严重问题:一旦语言里引进了赋值,代换就不再适合作为过程应用的模型了。作为这种情况的一个结果,我们现在还没有办法在技术上理解为什么过程withdraw会有上面所说的行为方式。因此我们需要开发一个新模型,来解释这以过程。在此之前我们先来看看withdraw所提出的问题的几种变形。 赋值和局部状态 下面过程make-withdraw能够创建出一种“提款处理器”。其形式参数描述了有关账户的初始余额值。 (define (make-withdraw balance) (lambda (amount) (if (= balance amount) (begin (set! balance (- balance amount)) balan

您可能关注的文档

文档评论(0)

laolao123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档