6.7.1 特殊格式
ifelse和cond触发器用一种特殊的方式处理bottom.他们的格式都为:
<exp_cond>是条件表达式,根据是否为非0,控制<exp_true>和<exp_false>哪个将被返回.
如果还没有被返回前产生了bottom,则将不会把bottom传播至表达式其余部分.
例如,思考表达式IfElse(time > 0, 1.0/time, 2)),如果time>0,则表达式的值为1.0/time,一个有效的浮点值.
如果time=0,则表达式的值为2,即使是不使用的部分除以0产生了bottom.
然而,即使上面的ifelse触发器从不返回bottom,它仍然有一个烦人的特征:除以0仍然会生产一个warning在debug的时候.
这是因为ifelse计算了所有的参数,甚至是没用到的那部分.相反,Cond将只计算实际用到的参数.
因此,如果我们重写表达式为 Cond(time > 0, 1.0/time, 2),当time等于0的时候参数 1.0/time 将永远不会被计算,所以也就不会生产warning了.
你也许想知道何时使用Cong和IfElse.
回答是你几乎经常要用到Cond,除非你需要<exp_true>或<exp_false>中的副作用.
换句话说,如果你正在给变量赋值(在一个经常需要被执行的分支中,无论<exp_cond>的值是什么),则你需要使用ifelse.
否则,你应该使用Cond,尤其是为了隔离bottom.