Рэкет: ожидается: процедура?

У меня есть следующий код:

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

(извините, если мой код выглядит ужасно, нужно использовать этот язык только один раз)

компилятор говорит:

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

person Potheker    schedule 30.01.2020    source источник


Ответы (1)


Вы вводите код в области взаимодействия.

Не надо. Введите его в область исходного кода и загрузите. Тогда это работает.

Что происходит, функция count уже существует, и вы переопределяете его. Но если вы сделаете это в области взаимодействий, ваша новая функция будет использовать уже существующую, вместо того, чтобы рекурсивно вызывать себя, как это должно быть:

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

И существующая функция ожидает процедуру в качестве своего первого аргумента, как видно из ее документации.

person Will Ness    schedule 30.01.2020
comment
Хорошо поймал! (относительно ввода кода в области взаимодействия) - person soegaard; 30.01.2020
comment
@soegaard спасибо. Я смутно помню, что это обсуждалось на SO раньше. Единственное, что я смог найти, это этот ответ от вас. - person Will Ness; 30.01.2020