在Scheme中,if可以表示为布尔运算符的组合吗?

acf*_*zer 4 scheme boolean-logic syntactic-sugar

这是很容易表达andornot在以下方面if(与从本地绑定协助or)。我想知道反过来是否正确。我天真的第一次尝试:

(if test conseq altern) => (or (and test conseq) altern)
Run Code Online (Sandbox Code Playgroud)

但是,如果test是非#f并且conseq#f,则翻译评估为altern,这是不正确的。

在保持 的短路特性的同时,是否存在评估为正确值的翻译if

Eli*_*lay 5

听起来你有一个很好的解释为什么ifandand做得更多or。但是,如果您可以作弊并添加一个lambda以延迟实际结果:

(define-syntax-rule (if c t e) ((or (and c (lambda () t)) (lambda () e))))
Run Code Online (Sandbox Code Playgroud)