Ракетка: ожидается: процедура? - PullRequest
1 голос
/ 30 января 2020

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

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

1 Ответ

8 голосов
/ 30 января 2020

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...