SICP 习题 (1.6) 解题总结:对if语句的特殊处理

SICP 习题1.6探讨了是否需要为if提供特殊形式。通过对比常规过程new-if和if,发现new-if在处理某些情况时会导致无限递归,如在牛顿法求平方根的过程中。正则序和应用序环境下,if的特殊处理确保了正确执行。该习题强调了编程语言中if的特殊处理和条件判断的重要性。
摘要由CSDN通过智能技术生成

SICP 习题 1.6 还是讲的正则序和应用序,问题是从if过程的讨论开始的,习题说到名叫Alyssa P. Hacker的人觉的不需要为if提供一种特殊形式,可以直接用常规过程调用cond来实现。


我第一次看到这道题的时候的完全不明白题目是什么意思,我当时的反应是,“if有特殊形式吗?”,我没觉的if有什么特殊呀。有这样的反应是因为没有认真思考习题1.5,这次做题目比较细致,做习题1.5的时候就想过,使用正则序展开过程的时候,不理会if,直接展开所有过程不是更简单一些吗?后来发现,不理会if,直接展开过程是会导致问题的,必须对if进行特殊的处理才能让解释器正常工作。


我们先回想一下习题1.5,我们上次看习题1.5的时候就看到习题有一个假设,就是不管是正则序还是应用序,都假设if过程对条件进行判断后只对条件成立对应的部分进行处理,忽略条件不成立对应部分的部分。


有了这个假设,可以发现习题1.5中的过程在应用序环境下会“死机”,而在正则序环境下会返回0。

而这种针对if过程的特殊处理就是if的特殊形式。


现在习题1.6问的问题就是针对if过程的这种特殊处理有必要吗,通过常规的过程处理会有什么问题。


解答这个问题的好方法就是建构一个常规的过程去代替if过程,看会出现什么问题。

习题种已经帮我们定义好了这个代替if的过程,叫做new-if,习题种讲到这个过程是Alyssa的朋友Eva Lu Ator做的,过程定义如下:


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

这个new-if过程在处理一般参数时是没有问题的。做new-if过程的Eva做了一下测试,都没有问题:


(new-if (= 2 4) 0 5)
(new-if (= 2 2) 0 5)


接着,如果Eva通过new-if来重写求平方根的过程,似乎就有点问题了。


有关原来版

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值