Как я могу написать функцию исключения в ракетке? - PullRequest
1 голос
/ 02 марта 2020

Функция exclude производит все символы в строке, которые не являются прописными или строчными буквами или числами 0-9. Если строка пуста, она выдает "".

Код

(define (alphanum? c)
  (or (char-numeric? c)
      (char-alphabetic? c)))


пример: (excludes " " ) => " " (excludes "@hello friend#!")=>"@#!" в таком порядке. Как бы это сделать без использования абстрактных функций, таких как filter et c.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

«Хитрость» здесь в том, чтобы преобразовать строку в список и обратно, чтобы вы могли удобно использовать функции списка и выполнять рекурсивный анализ.

Без использования функций высшего порядка, таких как 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))))
1 голос
/ 02 марта 2020
; String [Char -> Boolean] -> String
; filters string's characters by fun
(define (filter-string-by str fun)
  (list->string (filter fun (string->list str))))

; Char -> Boolean
; is char alphanumeric?
(define (alphanum? char)
  (or (char-alphabetic? char)
      (char-numeric? char)))

; String -> String
; only include alphanum chars in the str
(define (only-include-alphanum str)
  (filter-string-by str alphanum?))

Пользовательский filter

; [X] [X -> Boolean] [List-of X] -> [List-of X]
; keeps each element, e, of l where (f e) holds
(define (my-filter f l)
  (cond
    [(empty? l) '()]
    [else (if (f (first l))
              (cons (first l) (my-filter f (rest l)))
              (my-filter f (rest l)))]))
...