1.比较形式上面的区别
(1)cond
(cond (<p1> <e1>)
(<p2> <e2>)
.......
(<pn> <en>))
或者
(cond (<p1> <e1>)
(<p2> <e2>)
.......
(else <en>))
(2)if
(if <predicate> <consequent> <alternative>)
2.实际应用上的不同(这里以DrRacket为IDE)
(1)最大的不同就是一个结果需要进行多个操作的时候
比如我判断n是否等于0
先换个行(newline)再(display)个什么东西。
这里算两条语句。如果使用if语句就不行。
而使用cond的话,在教学模式下是不行的,不过在选择语言模式下(比如使用#lang racket)就是可以的。
注:①其实你看1中的两种形式上的不同就可以知道,cond的每个情况都是用()括起来的,所以里面的e即使有几条,都是能够和下一个条件的p区分开的。
②当然还是有可以在if里面使用多条语句的办法,将想要执行的多个语句打包在(begin <e1> <e2> .....)这样使用即可。
不过这样使用终归没有cond方便。
③cond中,需要几个一起执行的语句是不需要单独用一个()括起来的,直接写就可以了。
比如:看上去也很清晰。
(define (start-test-3 begin counter)
(define t1 (runtime))
(cond ((= counter 0)
(newline)
(display "OK"))
((prime? begin)
(report begin (- (runtime) t1))
(start-test-3 (+ begin 2) (- counter 1)))
(else
(start-test-3 (+ begin 2) counter))))
(2)#lang planet neil/sicp,if没有else的时候
这个环境是专门为sicp开发的
所以支持一些scheme有,但是racket不支持的语法。
比如
(define (test n)
(if (= n 0)
(display "OK")))
if语句没有给出else的情况。
(3)cond优点
个人感觉cond要比if好用很多。
比如在写一个迭代的时候,如果同时拥有计数结束,以及中间判断某条件的结束。
使用if的话就有点捉襟见肘,需要嵌套才可以。
比如:
(define (do-the-check n times)
(cond ((= times n) true) 。。。。。。。。。。。。A
((= (expmod times n n) times) (do-the-check n (+ times 1)))
(else false)) 。。。。。。。。。。。。B
有AB两种可能使这个迭代结束。A是计数到达n。B是计算expmod不等于n。
使用cond可以很方便地实现这种情况。使用if怎么都需要嵌套很不方便。