File io 方案帮助-文件统计

File io 方案帮助-文件统计,file-io,scheme,File Io,Scheme,所以我必须在Scheme中完成一个项目,我被卡住了。基本上,程序所做的就是打开一个文件并输出统计数据。现在我可以计算字符数,但我还需要计算行数和单词数。我现在只是想解决这个问题,但最终我还必须接受两个文件——第一个是文本文件,比如一本书。第二个是单词列表,我必须计算这些单词在第一个文件中出现的次数。显然,我将不得不与列表一起工作,但我希望能得到一些帮助。这是我到目前为止所拥有的代码(并且有效) 使用Scheme的字数计算算法已在堆栈溢出中进行了说明,例如(向上滚动到页面顶部以查看C语言中的等效程

所以我必须在Scheme中完成一个项目,我被卡住了。基本上,程序所做的就是打开一个文件并输出统计数据。现在我可以计算字符数,但我还需要计算行数和单词数。我现在只是想解决这个问题,但最终我还必须接受两个文件——第一个是文本文件,比如一本书。第二个是单词列表,我必须计算这些单词在第一个文件中出现的次数。显然,我将不得不与列表一起工作,但我希望能得到一些帮助。这是我到目前为止所拥有的代码(并且有效)


使用Scheme的字数计算算法已在堆栈溢出中进行了说明,例如(向上滚动到页面顶部以查看C语言中的等效程序):


该过程接收一个输入端口作为参数,因此可以将其应用于(比如)文件。请注意,对于计算单词和行,您需要测试当前字符是新行字符还是空白字符。并且需要一个额外的标志(代码中称为
状态
)来跟踪新词的开头/结尾。

如何将文件“标记化”为一个行列表,其中一行是一个词列表,一个词是一个字符列表

(define (tokenize file)
  (with-input-from-file file
    (lambda ()
      (let reading ((lines '()) (words '()) (chars '()))
        (let ((char (read-char)))
          (if (eof-object? char)
              (reverse lines)
              (case char
                ((#\newline) (reading (cons (reverse (cons (reverse chars) words)) lines) '() '()))
                ((#\space)   (reading lines (cons (reverse chars) words) '()))
                (else        (reading lines words (cons char chars))))))))))
一旦你做到了这一点,剩下的就无关紧要了

> (tokenize "foo.data")
(((#\a #\b #\c) (#\d #\e #\f))
 ((#\1 #\2 #\3) (#\x #\y #\z)))

请提供可能的无“悬挂式”的副本;它们不是支架。
(define (tokenize file)
  (with-input-from-file file
    (lambda ()
      (let reading ((lines '()) (words '()) (chars '()))
        (let ((char (read-char)))
          (if (eof-object? char)
              (reverse lines)
              (case char
                ((#\newline) (reading (cons (reverse (cons (reverse chars) words)) lines) '() '()))
                ((#\space)   (reading lines (cons (reverse chars) words) '()))
                (else        (reading lines words (cons char chars))))))))))
> (tokenize "foo.data")
(((#\a #\b #\c) (#\d #\e #\f))
 ((#\1 #\2 #\3) (#\x #\y #\z)))