Scheme中自定义or函数运行异常,请求排查问题根源
你的Scheme
or 实现问题解析 嘿,我来帮你拆解这个问题~你遇到的问题主要来自两个点:Lambda演算写法和Scheme语法的差异,以及对两种环境中布尔值表示的误解。
1. 你当前代码的直接语法问题
你写的代码:
(define or (lambda (p q) p p q))
在Scheme里,lambda的体是一系列表达式,解释器会依次执行每个表达式,最后返回最后一个表达式的结果。所以这个lambda的行为是:
- 先计算
p(比如调用(or #t #f)时,这里得到#t,但这个结果被丢弃了) - 再计算
p(又得到#t,同样被丢弃) - 最后计算
q(得到#f,这就是整个lambda返回的值)
这就是为什么调用(or #t #f)会返回#f——不管p是什么,最终都会返回q的值。
2. Lambda演算写法和Scheme的核心差异
你在视频里看到的λpq.ppq是Lambda演算中的逻辑或实现,但Lambda演算和Scheme的布尔值表示完全不同:
- 在Lambda演算里,布尔值是函数:
- 真(对应Scheme的
#t)是λa.λb.a(一个接受两个参数,返回第一个参数的函数) - 假(对应Scheme的
#f)是λa.λb.b(接受两个参数,返回第二个参数的函数)
所以λpq.ppq的逻辑是:如果p是真函数,就返回p(也就是真);如果p是假函数,就返回q——这在Lambda演算里是正确的逻辑或。
- 真(对应Scheme的
但在Scheme里,#t和#f是原生特殊值,不是可调用的函数。如果你把代码改成Lambda演算对应的Scheme写法:
(define or (lambda (p q) (p p q)))
调用(or #t #f)会直接报错,因为你试图把#t当作函数来调用,这在Scheme里是不允许的。
3. 正确的Scheme or 实现
要在Scheme里实现逻辑或,你需要利用Scheme的条件判断,模拟“如果第一个参数为真就返回真,否则返回第二个参数”的逻辑:
(define my-or (lambda (p q) (if p p q)))
或者更直观的写法(因为逻辑或只要p为真就返回#t,否则返回q的真假):
(define my-or (lambda (p q) (if p #t q)))
注意:不要直接命名为or,因为Scheme已经内置了or特殊形式(它还支持短路求值、多参数),自定义同名变量可能会引发问题。
内容的提问来源于stack exchange,提问作者94Echo
相关产品推荐
相关产品推荐

