Я пытаюсь реализовать функцию, которая рекурсивно удаляет все лишние пробелы из заданного потока. Любые последовательные пробелы должны быть удалены, что позволяет использовать одно максимальное пространство между словами. Я не могу понять, как правильно это реализовать.Racket Scheme - Удаление повторяющихся последовательных символов из потока
Я попытался преобразовать поток в список и манипулировать им таким образом, но я просто не могу понять, как построить новый поток и вернуть его, основываясь на моих тестах для каждого элемента. Я попытался использовать поток-карту, но это не похоже на работу для меня в этой ситуации (удаление элементов, строительство нового потока)
Вот мой текущий сломаны реализация REMOVE-экстра-пространств:
(define remove-extra-spaces
(lambda (str)
(cond (not (not-more-than-one-space str 0) (stream-append (stream-first str) (remove-extra-spaces (stream-rest str))))
(else (remove-extra-spaces (stream-rest str)))
)))
(define not-more-than-one-space
(lambda (str count)
(cond ((stream-empty? str) #T)
((equal? (stream-first str) #\space) (not-more-than-one-space (stream-rest str) (+ count 1)))
((> count 1) #F)
(else #T)
)
))
Я написал тест, который поможет мне найти, когда есть несколько последовательных пробелов. Однако я не могу понять, как использовать этот тест для создания нового потока на основе того, что его передает. Поток-фильтр не работал для меня, когда я пытался использовать его в сочетании с потоковой картой.
Спасибо. Я рассмотрю использование потоков-минусов. Я применил его в мою функцию remove-extra-spaces, однако при попытке преобразовать его в список я получаю сообщение об ошибке. Я заменил stream-append потоками-минусами. Ошибка: поток-первых: нарушение контракта ожидается: (? И/с потоком (не/с поток пустой)?) Дано: # –
Должен ли я проводить какую-то внутреннюю рекурсии, возможно, с letrec, для выполнения этой задачи? Я пытаюсь понять вашу реализацию, поэтому я тоже могу это сделать. –
Попробуйте написать версию, которая работает в списке вместо потока. То есть ваша функция должна потреблять список и создавать список с развалом пробелов. Если вы можете написать это успешно, потоковая версия легко конвертировать. –