Как узнать количество строчных букв в Scheme Racket?

Я пытаюсь найти количество строчных и прописных букв в строке, но есть проблема с моим кодом:

(define case
  (lambda (list)
    (if(char-lower-case? (car list))
       (case (cdr list))
       (+ 1 (case (cdr list)))
       )
    ))

(case (string->list "ScheMe"))

Как я могу решить эту проблему?

2 ответа

Решение

В вашей функции у вас есть две проблемы:

  1. case предопределенный оператор в ракетке / схеме

  2. Вы не проверяете пустой список.

Кроме того, вы используете параметр list, который является примитивным оператором и не должен использоваться в качестве имени переменной.

Вот рабочая функция:

(define (case1 lst)
    (cond ((null? lst) 0)
          ((char-lower-case? (car lst)) (case1 (cdr lst)))
          (else (+ 1 (case1 (cdr lst))))))

(case1 (string->list "ScheMe"))

В вашем коде отсутствует базовый вариант. (case '()) следует оценить 0 но вы получаете ошибку, так как вы делаете car а также cdr на nil,

Другие вещи, которые могут быть неправильными:

Ваш заголовок означает, что вы хотите считать строчные буквы, но вы увеличиваете для каждого заглавного.

list а также case имена из стандартной библиотеки. Для R5RS это означает неопределенное поведение, а для R6RS и позже это означает, что привязки библиотеки будут недоступны. В #!racket (Я полагаю, вы используете этот язык, так как вы пометили ракетку), он работает как R6RS.

Другие вопросы по тегам