Как узнать количество строчных букв в Scheme Racket?
Я пытаюсь найти количество строчных и прописных букв в строке, но есть проблема с моим кодом:
(define case
(lambda (list)
(if(char-lower-case? (car list))
(case (cdr list))
(+ 1 (case (cdr list)))
)
))
(case (string->list "ScheMe"))
Как я могу решить эту проблему?
2 ответа
В вашей функции у вас есть две проблемы:
case
предопределенный оператор в ракетке / схемеВы не проверяете пустой список.
Кроме того, вы используете параметр 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.