我正在尝试实现一个递归删除给定流中所有额外空格的函数。应删除任何连续的空格,允许在单词之间留出一个最大空格。我无法弄清楚如何正确实现这一点。
我已经尝试将流转换为列表并以这种方式操作它,但我根本无法弄清楚如何构建新流并根据我对每个元素提供的测试返回它。我试图使用流映射,但在这种情况下它似乎不适合我(删除元素,构建新流)
这是我目前对remove-extra-spaces的破坏实现:
(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)
)
))
我写了一个测试,以帮助我找到多个连续空格。但是,我无法弄清楚如何使用此测试根据传递的内容创建新流。当我尝试将它与stream-map结合使用时,流过滤器对我不起作用。
答案 0 :(得分:1)
您知道如何使用stream-cons
吗?这可能是实现这一目标的最简单方法。这是我的实现(使用SRFI 41流库而不是racket/stream
,因为我对此更为熟悉):
(require srfi/41)
(define-stream (collapse-spaces strm)
(stream-let loop ((was-space #f)
(strm strm))
(cond ((stream-null? strm) strm)
((char=? (stream-car strm) #\space)
(if was-space
(loop #t (stream-cdr strm))
(stream-cons #\space (loop #t (stream-cdr strm)))))
(else (stream-cons (stream-car strm)
(loop #f (stream-cdr strm)))))))
示例运行:
> (stream->list (collapse-spaces (stream #\f #\o #\o #\space #\space #\b #\a #\r)))
(#\f #\o #\o #\space #\b #\a #\r)