Scheme 如何找到;不是一个程序”;错误
它一直说((补码奇怪?)2)不是一个程序。我不知道如何修复它。当您运行此代码时,您会看到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)
在定义中是红色的,您会得到以下错误:
(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