球拍:预期:程序?

Pot*_*ker 0 scheme runtime-error function contract racket

我有以下代码:

(define numbers '(2 3 5 3 1 22 2))

(define (count val l) 
    (if (null? l)
        0
        (+
            (if (= (first l) val) 1 0)
            (count val (rest l))   
        )
    )
)

(display (count 6 numbers))
Run Code Online (Sandbox Code Playgroud)

(对不起,如果我的代码看起来很糟糕,只需要使用这种语言一次)

编译器说:

count: contract violation
  expected: procedure?
  given: 6
  argument position: 1st
  other arguments...:
   '(3 5 3 1 22 2)
Run Code Online (Sandbox Code Playgroud)

Wil*_*ess 7

您正在交互区域中输入代码。

别。在源代码区输入,并加载。然后它起作用了。

发生的情况是,该函数count已经存在,而您正在重新定义它。但是如果你在交互区域这样做,你的新函数将使用已经存在的函数,而不是像它应该的那样递归调用自己:

(define (count val l) 
    (if (null? l)
        0
        (+
            (if (= (first l) val) 1 0)
            (count val (rest l))       ;; ****** HERE
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

现有函数需要一个过程作为它的第一个参数,如其文档中所示。

  • 不错的收获!(关于在交互区输入代码) (2认同)