Scheme 方案案例错误

Scheme 方案案例错误,scheme,Scheme,我正在尝试在Scheme中创建一个单词计数程序。我想我已经制定了一个算法,可以计算我的行数、字数和字符数,但是当我开始运行程序时,它告诉我“对象#\1不适用。”“1”是我正在读取的文件中的第一个字符,它应该在“else”下。我所看到的一切都与我的案例陈述相符,所以我认为我做得对,但很明显,某个地方出了问题。谢谢你的帮助 (define files (lambda (reading n) (begin (define in (open-input-file reading)

我正在尝试在Scheme中创建一个单词计数程序。我想我已经制定了一个算法,可以计算我的行数、字数和字符数,但是当我开始运行程序时,它告诉我“对象#\1不适用。”“1”是我正在读取的文件中的第一个字符,它应该在“else”下。我所看到的一切都与我的案例陈述相符,所以我认为我做得对,但很明显,某个地方出了问题。谢谢你的帮助

(define files
  (lambda (reading n)
    (begin
      (define in (open-input-file reading))
      (let loop ((lines 0)
         (words 0)
         (chars 0)
         (port (read-char in)))
       (case (port)
         ((#\newline)
           (loop (+ lines 1) words (+ chars 1) (read-char in)))
         ((#\space #\tab)
           (loop lines (+ words 1) (+ chars 1) (read-char in)))
         (else (loop lines words (+ chars 1) (read-char in)))))
  (close-input-port in)

  (display lines)
  (display " ")
  (display words)
  (display " ")
  (display chars)
  (newline)
  (display "Top ")
  (display n)
  (display " word(s):")
  (newline)
  '())))

幸运的是,你的问题很容易解决。你写过:

(case (port) ...)
但是调用函数
端口的结果会出现
情况。当然,
port
不是函数,而是字符,所以您只需要:

(case port ...)
“让循环”如何知道您何时到达文件末尾?读字符到达末尾时返回什么?提示:阅读有关eof对象的信息?谓语谓词是返回#t或#f的函数。您可能需要使用cond而不是case来使用此谓词

此外,行、字符和单词变量是命名let的本地变量,因此不能在“外部”打印。(提示:当(eof对象?端口)返回#t时,在循环内打印它们


风格诡辩:对于读取字符返回的字符,不要使用“端口”这个名称。“in”是端口(文件句柄),也许你可以使用“ch”而不是“port”。

谢谢!这解决了一个问题,但现在我有了另一个问题……我可能可以通过显示等方式找到这个新的端口。如果这个答案对你有效,你应该“接受”通过单击答案旁边的复选标记进行编辑。请注意。