Common Lisp:用AND& amp替换IF要么?

时间:2015-03-17 22:16:51

标签: common-lisp

我坚持练习4.28。 “符号计算的温和介绍”一书(p.129):

  

我们通常可以将IF重写为AND加OR的组合   遵循这个简单的方案:替换(IF 测试true-part false-part )   使用等效表达式(OR(AND test true-part )   假部分)。但是该方案不能用于表达(IF(ODDP 5)(EVENP 7)'FOO)。为什么会失败?建议更复杂的方法   将IF重写为不会失败的AND和OR的组合。

(or (and (oddp 5) (or (evenp 7) t)) 'foo)评估 true-part 并停止,如果 test 为NIL,它将评估 false-part ,但是如果 test 是T,它总是返回T,这不反映IF的行为。到目前为止,本书中学到的问题是否有正确的解决方案,或者是目前没有的练习答案?

如果有练习,我不是要求练习的解决方案,只是我继续寻找练习是否有意义。

1 个答案:

答案 0 :(得分:3)

你很亲密。它失败是因为(EVENP 7)(结果)恰好是错误值NIL,然后整个and表单变为NILor将评估备选方案。

是。有一种方法可以解决这个问题,即使只知道你已经在问题中提出的形式,但它可能不适用于将来的副作用(打印东西的表达)。