Scheme简明教程6-条件语句

第四章 条件语句

和其它的编程语句一样,Scheme 也包含条件语句。最基本的结构就是if

(if测试条件
    then-分支
    else-分支)

如果测试条件运算的结果是真(即,非#f的任何其它值)”then”分支将会被运行(即满足条件时的运行分支)。否则,”else”分支会被运行。”else”分支是可选的。

(definep80)
 
(if (>p70) 
    'safe
    'unsafe)
=>  safe
 
(if (<p90)
    'low-pressure) ;no ``else'' branch
=>  low-pressure

为了方便,Scheme还提供了一些其它的条件结构语句。它们可以被定义成宏来扩充if表达式。

4.1          when  unless

当我们只需要一个基本条件语句分支时(”then”分支或”else”分支),使用when  unless会更方便。(这里的示例已经更换,原示例)

(define a 10)

(define b 20)

(when (< a b)

       (display “a)

       (display a)

       (display “b)

       (display b)

       (display “a大于b” ) )

先判断a是否小于b,这个条件成立时会输出5条信息。

使用if实现相同的程序会是这样:

(define a 10)

(define b 20)

(if (< a b)

       (begin

              (display “a)

              (display a)

              (display “b)

              (display b)

              (display “a大于b” ) ))

注意when的分支是一个隐式的begin语句结构,而如果if的分支有多个代码结构时,需要一个显式的begin代码结构。

同样的功能还可以像下面这样用unless来写(unlesswhen的意思正好相反)

(define a 10)

(define b 20)

(unless (>= a b)

       (display “a)

       (display a)

       (display “b)

       (display b)

       (display “a大于b” ) )

并不是所有的Scheme环境都提供whenunless。如果你的Scheme中没有,你可以用宏来自定义出whenunless(宏,见第8)

4.2          cond

cond结构在表示多重if表达式时很方便,多重if结构除了最后一个else分支以外的其余分支都会包含一个新的if条件。因此,

(if (char<?c#\c) -1
    (if (char=?c#\c) 0
        1))

这样的结构都可以使用cond来这样写:

(cond ((char<?c#\c) -1)
      ((char=?c#\c) 0)
      (else1))

cond就是这样的一种多分支条件结构。每个从句都包含一个判断条件和一个相关的操作。第一个判断成立的从句将会引发它相关的操作执行。如果任何一个分支的条件判断都不成立则最后一个else分支将会执行(else分支语句是可选的)

cond的分支操作都是begins结构。

4.3          case

cond结构的每个测试条件是一个测试条件的分支条件时,可以缩减为一个case表达式。

(define c #\c)

(casec
  ((#\a) 1)
  ((#\b) 2)
  ((#\c) 3)
  (else4))
=>  3

分支头值是 #\c 的分支将被执行。

4.4          and  or

Scheme提供了对boolean值进行逻辑与(”and”)和逻辑或(”or”)运算的结构。(我们已经见过了布尔类型的求反运算not过程。)

当所有子结构的值都是真时,and的返回值是真,实际上,and的运行结果是最后一个子结构的值。如果任何一个子结构的值都是假,则返回#f

(and12=>  2
(and#f1) =>  #f

or会返回它第一个为值为真的子结构的结果。如果所有的子结构的值都为假,or则返回#f

(or12=>  1
(or#f1) =>  1

andor都是从左向右运算。当某个子结构可以决定最终结果时,andor会忽略剩余的子结构。

(and1#fexpression-guaranteed-to-cause-error)
=>  #f
 
(or1#fexpression-guaranteed-to-cause-error)
=>  1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值