文档章节

exec 1.6

mayqlzu
 mayqlzu
发布于 2012/12/04 21:10
字数 469
阅读 151
收藏 0
(define (square x)
  (* x x)
)


(define (good-enough guess x)
  (< (abs(- (square guess) x)) 0.001)
  )


(define (improve guess x)
  (/ (+ guess (/ x guess)) 2)
  )

// 这个题其实和1.5是一个原理,这儿的new-if是循环定义,所以采用应用序的解释器会陷入死循环;这种循环定义其实就是递归定义,只是没有机会结束递归。

(define (new-if predicate then-clause else-clause)
  ( cond (predicate then-clause)
         (else else-clause)     )
   )

// new-if的第二种定义,将cond换成if,效果也是一样的,这样写就更明显了,用if定义了一个新的if,就相当于是例子1.5中的(define (p) (p)),用p定义p,造成死循环;
(define (new-if predicate then-clause else-clause)
  ( if predicate then-clause
        else-clause     )
   )


(define (sqrt-iter guess x)
  (new-if (good-enough guess x)
    guess
    (sqrt-iter (improve guess x) x)
  )
)


(define (my-sqrt x)
  (sqrt-iter 1.0 x))


这个例子给我们一个启示,不要做循环定义,循环定义不光是没有意义,还会让解释器陷入死循环。

这儿还有一个问题:cond和if功能是等价的,用cond写的程序都能用if代替,多嵌套几个if就行了;用if写的程序也能用cond代替,这个代替就更简单了,cond本来可以写多个条件,留两个就够了;那既然cond和if是等价的,为什么scheme要同时支持这两个关键字呢?

其实,只选一个的确是够了,选两个也没大碍;关键的问题是,不能像上文的例子那样,用cond定义一个if-new,也不能用if定义一个cond-new,否则程序就有死循环的可能。

哦,我们要分清楚以下两个不同的概念:

1 程序中对if的”调用“可以用cond”调用“替换,反之亦可;

2 if过程“定义本身” “不能”用cond定义;cond过程”定义本身“也“不能”用if定义;

这两个概念很容易混淆,仔细想一想。



© 著作权归作者所有

上一篇: exec 1.7
下一篇: exec 1.5
mayqlzu
粉丝 2
博文 41
码字总数 8484
作品 0
浦东
程序员
私信 提问
Maven 参数(maven.test.skip 和 maven.test.skip.exec) 区别

Part 1:原因在于我们参数的差异: 情况1 :mvn clean install -Dmaven.test.skip=true 这种情况,即不编译测试类文件,也不执行测试类文件 情况2:mvn clean install –Dmaven.test.skip.ex...

余二五
2017/11/15
0
0
JasperReports 的 PHP 版本--JasperPHP

JasperPHP 包是通过 JasperStarter v3 命令行工具来生成 JasperReports 6 报表。 安装 composer require cossou/jasperphp 介绍 这个包的目标是生成一个 PHP 解决方案,用来编译和运行 Jasp...

匿名
2016/01/06
314
0
Upstart 1.6 发布,系统初始化守护进程

Upstart 是一个用以替换 /sbin/init 守护进程的软件,基于事件机制开发。可用来处理启动过程中的任务和服务启动。 Upstart 1.6 ChangeLog: 'telinit u' now performs a stateful re-exec, al...

oschina
2012/11/16
917
2
springside4.0安装问题

不好意思 我是新手 做第二步“进入support/h2目录里,执行mvn java:exec将H2数据库运行起来”的时候,出现下面的问题,请问下这个怎么解决 出错代码:“no plugin found for prefix 'java' i...

王匹夫
2012/03/06
1K
1
Android自动打包、签名、优化、上传ANT脚本

此脚本是针对于android在线更新的SDK,以前android有离线安装包,后来改为直接在线安装进行,两者的成本在于sdk的路径和一些工具类的路径不同。 此脚本用于进行自动编译用户需要的APK安装包,...

迷糊
2011/01/18
2.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

灵光一闪来个科普贴:Linux文件系统

在计算机系统中,各种需要保存的信息都是以文件的形式存在的。文件管理是对系统信息资源的管理,是操作系统的一项重要功能。 1.文件与文件系统: 1.1文件: 文件是具有名字的一组相关信息的有...

Linux就该这么学
30分钟前
4
0
ExtJS 4.2 评分组件

本文转载于:专业的前端网站➸ExtJS 4.2 评分组件 上一文章是扩展ExtJS自带的Date组件。在这里将创建一个评分组件。 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2...

前端老手
33分钟前
4
0
如何为视频添加封面?

一个好的视频封面可以吸引观众的眼球,从而起到事半功倍的宣传效果,但是很多小伙伴并不知道怎么给视频添加封面。下面分享一个制作封面否方法,操作起来也比较简单的,有兴趣的小伙伴请接着往...

白米稀饭2019
43分钟前
4
0
如何使用soapUI模拟webservice客户端发送请求

参考资料 https://jingyan.baidu.com/article/cbcede0712849a02f40b4d88.html 左边是请求参数,可以自己填写!按着那个绿色三角箭头可以模拟发送请求,右边是返回的报文 soapui如何发送xml格...

故久呵呵
今天
6
0
Java Security 介绍

1.介绍 Java平台设计的重点是安全性。在其核心,java语言本身是类型安全的并且提供了垃圾自动回收,这使其增加了应用程序代码的健壮性。安全的类加载以及验证机制确保了只有合法的代码才能够...

lixiaobao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部