Scheme 如何找到;不是一个程序”;错误

Scheme 如何找到;不是一个程序”;错误,scheme,racket,Scheme,Racket,它一直说((补码奇怪?)2)不是一个程序。我不知道如何修复它。当您运行此代码时,您会看到((补码奇数?)2)在定义中是红色的,您会得到以下错误: (define (comp f g) (lambda (x)(f (g x)))) (define (complement f) (cond ((equal? (comp f (lambda (g) g)) #t) #f) ((equal? (comp f (lambda (g) g))

它一直说((补码奇怪?)2)不是一个程序。我不知道如何修复它。

当您运行此代码时,您会看到
((补码奇数?)2)
在定义中是红色的,您会得到以下错误:

(define (comp f g)
  (lambda (x)(f (g x))))

(define (complement f) (cond ((equal? (comp f (lambda (g) g)) #t) #f)
                             ((equal? (comp f (lambda (g) g)) #f) #t)))

((complement odd?)2)
如果您真的想看到它,请在某处使用它:

(complement odd?)
; ==> nothing (aka #<void>)
毫无疑问,
comp
的使用成为了一个过程。这并不奇怪,因为主体有一个lambda形式,表示返回将是一个过程当您没有
else
(默认)术语时,它将永远不会是
#t
#f
,当您的两个谓词都不为真时
cond
返回特定于实现的defauls值。在Racket中,这是由REPL禁止的
#
,但在其他实现中,它可以是
香蕉
,或者实现者希望它是什么,所以您应该始终有一个
else
子句。如果你认为你不需要它,那么就去做
(否则(错误“永远不会发生”)
,你就可以去了。(试试看)

您的
条件中的结果是
#t
#f
。这意味着,如果您的代码能够正常工作,您将收到以下错误消息:

(comp f (lambda (g) g)) ; ==> #<procedure>
对于每个地方,返回的结果都不是一个过程,这将是一个错误,因为您将结果用作一个过程。您需要更改实现,使其始终返回一个过程

这就是如何找到“非过程”错误的答案。这不是如何修复您的程序的答案,但由于这是世界上最简单的程序,我将添加它。您有一个过程
comp
,它接受两个过程并返回这两个过程的组合。如果你想要add2,你可以
(定义add2(comp add1 add1))
补码必须是假值
#f
变为
#t
,而所有真值变为
#f
not
这样做是因为
not
odd?
的组合将成为与
偶数?
相同的过程:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #t
由于我们不改变任何东西,您可以使用替换方法来检查它的作用:

(define (complement f)
  (comp not f)) ; comp returns a procedure always

(define my-even? (complement odd?))
(my-even? 2) ; ==> #t

你的
补码
的实现一团糟。它实际上只需要用参数组合
而不是
。补码需要返回一个程序。我看到
cond
返回
#f
#t
和未定义的值,当缺少
else
子句时,这些都不是过程,因此将引发“不是过程”当您尝试应用结果时。我将如何修复它?通过使用
comp
补码从
cond
更改为
comp
(奇数?x)
的补码是
(非(奇数?x))
,因此
((comp非奇数?.x)
application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #t
(define (complement f)
  (comp not f)) ; comp returns a procedure always

(define my-even? (complement odd?))
(my-even? 2) ; ==> #t
(my-even? 2)                      ; ==>
((comp not odd?) 2)               ; ==>
(((lambda (x) (not (odd? x))) 2)  ; ==>
(not (odd? 2))                    ; ==>
(not #f)                          ; ==>
#t