计划案例错误

时间:2012-03-31 18:57:00

标签: scheme

我正在尝试在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)
  '())))

2 个答案:

答案 0 :(得分:2)

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

(case (port) ...)

但是对调用函数case的结果执行了port。当然,port不是一个函数,它是一个字符,所以你只需要:

(case port ...)

答案 1 :(得分:0)

当你到达文件的末尾时,“let循环”是如何知道的? read-char在结束时会返回什么?提示:阅读有关eof-object的内容?谓语。谓词是返回#t或#f的函数。您可能需要使用cond而不是case来使用此谓词

此外,行,字符和单词变量是命名let的本地变量,因此您无法打印出“外部”。 (提示:当(eof-object?port)返回#t。

时,在循环中打印它们

样式狡辩:不要将名称“port”用于read-char返回的char。 “in”是端口(文件句柄),也许你可以使用“ch”而不是“port”。