Scheme 球拍方案-从流中删除重复的连续字符

Scheme 球拍方案-从流中删除重复的连续字符,scheme,lisp,racket,Scheme,Lisp,Racket,我试图实现一个递归地从给定流中删除所有额外空间的函数。任何连续的空格都应该删除,允许单词之间有一个最大的空格。我不知道如何正确地实现这一点 我曾尝试将流转换为列表并以这种方式对其进行操作,但我无法根据对每个元素的测试所提供的内容,确定如何构造新流并返回它。我曾尝试使用流映射,但在这种情况下它似乎不起作用(删除元素,构建新流) 以下是我当前的“删除额外空间”的中断实现: (define remove-extra-spaces (lambda (str) (cond (not (

我试图实现一个递归地从给定流中删除所有额外空间的函数。任何连续的空格都应该删除,允许单词之间有一个最大的空格。我不知道如何正确地实现这一点

我曾尝试将流转换为列表并以这种方式对其进行操作,但我无法根据对每个元素的测试所提供的内容,确定如何构造新流并返回它。我曾尝试使用流映射,但在这种情况下它似乎不起作用(删除元素,构建新流)

以下是我当前的“删除额外空间”的中断实现:

    (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)
            )
    ))

我写了一个测试来帮助我发现什么时候有多个连续的空格。但是,我不知道如何使用此测试根据通过测试的内容创建新流。当我尝试将流过滤器与流地图结合使用时,它对我不起作用。

您知道如何使用
流cons
?这可能是实现这一点最简单的方法。这是我的实现(使用流库而不是
racket/stream
,因为我更熟悉它):

样本运行:

> (stream->list (collapse-spaces (stream #\f #\o #\o #\space #\space #\b #\a #\r)))
(#\f #\o #\o #\space #\b #\a #\r)

非常感谢。我将研究使用streamcons。我将它应用到我的remove-extra-spaces函数中,但是当我再次尝试将其转换为列表时,会抛出一个错误。我用stream cons替换了stream append。错误是:stream first:contract invalization expected:(和/c stream?(不是/c stream empty?)给定:#我是否应该追求某种内部递归,也许是使用letrec来执行此任务?我试图理解你的实现,这样我也可以自己做。试着编写一个在列表而不是流上运行的版本。也就是说,您的函数应该使用一个列表,并生成一个折叠了空格的列表。如果你能成功地写出来,流版本很容易转换成。我一开始应该把它当作一个列表问题来处理。你的建议非常有用——我在列表实现中得到了它。我将使用stream->list,并以这种方式处理数据。谢谢
> (stream->list (collapse-spaces (stream #\f #\o #\o #\space #\space #\b #\a #\r)))
(#\f #\o #\o #\space #\b #\a #\r)