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