当你运行这段代码时你会看到((complement odd?) 2)
定义中为红色,您会收到以下错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
所以这意味着(complement odd?)
不返回过程但返回值#<void>
。让我们尝试一下:
(complement odd?)
; ==> nothing (aka #<void>)
如果你真的想看到它在某个地方使用它:
(list (complement odd?))
; ==> (#<void>) now you see it
这意味着您没有处理所有可能的检查cond
in complement
我明白为什么..你尝试过吗comp
?
(comp f (lambda (g) g)) ; ==> #<procedure>
肯定够用了comp
成为一个程序。这并不奇怪,因为主体有一种 lambda 形式,表明返回将是一个过程。永远不会是#t
or #f
当你没有else
(默认)当你的谓词都不成立时的术语cond
返回特定于实现的默认值。在球拍中这是#<void>
它被 REPL 抑制,但在其他实现中它可以banana
或任何实施者想要的东西,所以你应该总是有一个else
条款。如果您认为不需要它,那么就这样做(else (error "should never happen"))
现在就可以走了。 (尝试一下)
你的后果cond
are #t
and #f
。这意味着如果您的代码可以正常工作,您将收到以下错误消息:
application: not a procedure;
expected a procedure that can be applied to arguments
given: #t
对于每个地方,您返回的内容不是过程,这将是一个错误,因为您将结果用作过程。您需要更改您的实现,使其始终返回一个过程。
因此,这就是如何查找“不是过程”错误的答案。这不是如何修复您的程序的答案,但由于这是世界上最简单的程序,我将添加它。你有一个程序comp
它需要两个过程并返回两个过程的组合。例如。如果你想要add2你可以(define add2 (comp add1 add1))
. The complement
一定是假值#f
turns #t
当所有的真实价值都转变时#f
. not
这样做的组成是not
and odd?
将成为与以下相同的程序even?
:
(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