and, or, not

Scheme中的「and, or, not」对应于「与, 或, 非」的逻辑概念, 但有一些细节值得讨论.

这其中最简单的是not, 它是一个函数. 其接受一个任意的值作为参数. 如果该值为真, 则返回#f; 如果该值为假, 则返回#t.

and和or不是函数, 因为对于and和or表达式的求值遵循短路规则.

and和or表达式都具有不定数目的句法参数, 每个句法参数都是一个表达式. (and)的值等于#t, (or)的值等于#f. 当and和or表达式只具有一个句法参数时, 该句法参数的值就是and或or表达式的值. 当它们具有大于一个的句法参数时, 它们都先对于其第一个句法参数求值. 对于and表达式而言, 这个值为#f的话, 就不需要再对于其后的表达式求值了, 因为不论其后的值如何, 整个and表达式的值都应该是#f, 所以此时and表达式会立即返回#f这个值, 否则的话, 也就是这个值为真的情况, and表达式就不再考虑这个句法参数了, 因为它对于and表达式的值不会有影响了, 转而对于下一个句法参数求值. 对于or表达式而言, 这个值为真的话, 那么整个or表达式的值就应该为真, 所以or表达式立即返回这个值, 否则的话, 也就是这个值为#f的情况, or表达式就不再考虑这个句法参数了, 因为它对于or表达式的值不会有影响了, 转而对于下一个句法参数求值. 以上是短路求值的想法, 但值得说明的是, 短路还是不短路将对于语义产生影响, 因为对于表达式的求值可能不终止, 或是对于表达式的求值会产生副作用.

文字的说明或许有些烦闷, 我们将展示一些求值的逐步过程. 以后读者遇到复杂的表达式时, 也应该采取类似的方法来帮助理解.

根据短路的and和or, abs函数也可以按照如下方式定义.

虽然这被视为一种技巧, 但我们将此视为丑陋的, 所以永远不会使用它.

你的回應