我坚持练习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的行为。到目前为止,本书中学到的问题是否有正确的解决方案,或者是目前没有的练习答案?
如果有练习,我不是要求练习的解决方案,只是我继续寻找练习是否有意义。
答案 0 :(得分:3)
你很亲密。它失败是因为(EVENP 7)
(结果)恰好是错误值NIL
,然后整个and
表单变为NIL
而or
将评估备选方案。
是。有一种方法可以解决这个问题,即使只知道你已经在问题中提出的形式,但它可能不适用于将来的副作用(打印东西的表达)。