所以,@PetSerAl 绝对正确,正确答案(如果我们正在寻找 lambda-calculus-esque 解决方案)是:
(define not
(lambda (b)
(lambda (x y) (b y x))))
因此:((not true) 1 2) 给出 2,((not false) 1 2) 给出 1。
但是由于您没有在问题中指定 lambda 演算,而是同时标记了 Racket 和 Scheme,所以我会给您一个在那里有效的答案。
考虑您是否有如上定义的true 和false。那么写not就这么简单:
(define not
(lambda (x)
(cond [(equal? x true) false]
[(equal? x false) true]
[else (error "Value is not true or false")])))
这与上面列出的语义相同:((not true) 1 2) 给出2,((not false) 1 2) 给出1。但它还有一个额外的好处,即您实际上可以直接检查它以查看值,而不仅仅是将其应用于另一个过程。例如:
> (not true)
#<procedure false>
> (not false)
#<procedure true>
你现在甚至可以使用equal?(或者真的是eq?),而在此之前,如果你尝试这样做,你总是会得到#f:
> (equal? (not true) false)
#t
> (equal? (not true) true)
#f
> (equal? (not false) true)
#t
> (equal? (not false) false)
#f
这引发了关于 PL 理论的完整讨论,即关于 lambda 演算可以决定什么和不能决定什么。我将在这里省略。但如果您有兴趣,我建议您查看this book,或that book。