条件分支

条件分支表达某种形式的选择.

想一下我们在数学中是如何定义一个实数的绝对值的.

我们可以直接地将其转换为一个Scheme定义.

这里牵扯到一个if表达式, 它的一般句法形式为(if <exp> <exp> <exp>). if表达式的语义是这样的, 它先对于其第一个句法参数求值, 若为真, 则对于第二个句法参数求值, 并且整个if表达式的值就是该求值的结果, 若为假, 则对于第三个句法参数求值, 并且整个if表达式的值就是该求值的结果.

读者应该注意到, if不是一个函数, 因为它不会对它的每个参数都求值, 而是根据对于第一个参数求值的结果, 选择第二个参数和第三个参数其中一个进行求值.

Scheme中还有一个非常常用的条件分支表达式, 名为cond.

其一般的句法形式为(cond (<exp> <exp>) ... (else <exp>)).

为了透明性, 我们应该对于省略号的意图做说明, 它表示前一个子句法形式出现零个至任意有限多个, 也就是说, 它和Kleene star其实是一样的, 只是看起来不同罢了, cond的句法形式也可以表达为(cond (<exp> <exp>)* (else <exp>)).

cond的语义十分简单, 它先对于第一个表达式对的第一个句法参数求值, 若为真, 则对于该对的第二个句法参数求值, 并且将其作为整个cond表达式的值 (剩下的就不会求值了), 若为假, 则将注意力转移到第二个表达式对, 如法炮制. 另外, else在cond的上下文中被视为真, 并且只能出现在最后一个表达式对中. else也可以不出现, 但若直至最后一个对仍然无法确定cond的值的话, 该表达式的值是未刻画的, 因实现而异. 依赖于这种特定实现细节的程序是完全丑陋的, 请读者不要写出丑陋的程序.

实际上, 在绝大部分Scheme实现中, cond表达式会被规约为等价的if表达式.

以下是数学中符号函数的例子.

其意思, 想必已经很明了了.


注记: Scheme将所有不等于#f的值视为真. 这个设计在某种意义上还是非常合理的, 但魔法语言学家肯定会拿出一堆理由反对它.

你的回應