«Хитрость» здесь в том, чтобы преобразовать строку в список и обратно, чтобы вы могли удобно использовать функции списка и выполнять рекурсивный анализ.
Без использования функций высшего порядка, таких как filter
, основа c фильтрация рекурсии по списку выглядит примерно так:
(define (a-filter ls)
(cond [(null? ls) '()]
[(include? (car ls)) (cons (car ls) (a-filter (cdr ls)))]
[else (a-filter (cdr ls))]))
, где процедура include?
полностью вымышленная.
В вашем случае вы могли бы написать так:
(define (no-alphanums ls)
(cond ((null? ls) '())
((not (alphanum? (car ls))) (cons (car ls) (no-alphanums (cdr ls))))
(else (no-alphanums (cdr ls)))))
и тогда вы можете определить
(define (excludes s)
(list->string (no-alphanums (string->list s))))