如何找到"不是程序"错误

时间:2016-10-02 19:26:20

标签: scheme racket

(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)

它一直说((补充奇数?)2)不是一个程序。我不确定如何解决它。

1 个答案:

答案 0 :(得分:0)

当您运行此代码时,您会在定义中看到((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的{​​{1}}中处理所有可能的检查,我明白为什么..您尝试过complement吗?

comp

使用(comp f (lambda (g) g)) ; ==> #<procedure> 肯定会成为一个程序。不奇怪,因为身体有一个lambda形式,表明返回将是一个过程。 永远不会是comp#t 当你的谓词都没有变为真时,你没有#f(默认)术语{{ 1}}返回特定于实现的默认值。在Racket中,这是else由REPL压制,但在其他实现中它可以是cond或者实现者想要的任何东西,所以你应该总是有一个#<void>子句。如果你认为自己不需要它,那就banana,你就可以了。 (尝试一下)

else的后果是(else (error "should never happen"))cond。这意味着如果您的代码已经运行,您将收到此错误消息:

#t

对于每个地方,由于您将结果用作程序,因此返回的内容不是一个错误的过程。您需要更改实现,以便始终返回过程。

因此,这是如何找到“非程序”错误的答案。它不是如何修复程序的答案,但由于这是世界上最简单的程序,我将添加它。你有一个程序#f,它需要两个程序并返回两者的组成。例如。如果你想要add2,你可以application: not a procedure; expected a procedure that can be applied to arguments given: #t comp必须是假值(define add2 (comp add1 add1))变为complement,而所有真值都会变为#f#t执行此操作,因此#fnot的合成将成为与not相同的过程:

odd?

由于我们不会改变任何内容,您可以使用替换方法来检查它的作用:

even?