Common lisp 通用Lisp:如果替换为AND&;或

Common lisp 通用Lisp:如果替换为AND&;或,common-lisp,Common Lisp,我坚持练习4.28。在《符号计算的温和介绍》(第129页)一书中: 我们通常可以将IF重写为AND加号或by的组合 遵循这个简单的方案:替换(如果测试正确部分,则替换错误部分) 使用等效表达式(或(和测试真实部分) 错误部分)。但该方案对表达式(IF(ODDP 5)(EVENP 7)‘FOO’失败。为什么会失败?建议一种更复杂的方法 将IF重写为and和OR的组合,且不会失败 (or(and(oddp 5)(or(evenp 7)t))'foo)计算真部分并停止,如果测试为零,它将计算假部分,但

我坚持练习4.28。在《符号计算的温和介绍》(第129页)一书中:

我们通常可以将IF重写为AND加号或by的组合 遵循这个简单的方案:替换(如果测试正确部分,则替换错误部分) 使用等效表达式(或(和测试真实部分) 错误部分)。但该方案对表达式(IF(ODDP 5)(EVENP 7)‘FOO’失败。为什么会失败?建议一种更复杂的方法 将IF重写为and和OR的组合,且不会失败

(or(and(oddp 5)(or(evenp 7)t))'foo)
计算真部分并停止,如果测试为零,它将计算假部分,但如果测试为t,它总是返回t,这并不反映if的行为。到目前为止,书中所学的知识是否有一个正确的解决方案,或者这个练习的答案在这一点上是没有的


我不是在问这个练习是否有解决方案,只是问我继续寻找是否有意义。

你很接近了。它失败是因为
(evenp7)
(结果)恰好是假值
NIL
,然后整个
表单变成
NIL
,而
将评估备选方案


对。即使只知道问题中已经呈现的表单,也有一种方法可以解决这个问题,但将来可能不会产生副作用(打印内容的表达式)

@Pascal除了多重评估警告之外,我看到的公式也需要
而不是