Scheme 方案案例错误
我正在尝试在Scheme中创建一个单词计数程序。我想我已经制定了一个算法,可以计算我的行数、字数和字符数,但是当我开始运行程序时,它告诉我“对象#\1不适用。”“1”是我正在读取的文件中的第一个字符,它应该在“else”下。我所看到的一切都与我的案例陈述相符,所以我认为我做得对,但很明显,某个地方出了问题。谢谢你的帮助Scheme 方案案例错误,scheme,Scheme,我正在尝试在Scheme中创建一个单词计数程序。我想我已经制定了一个算法,可以计算我的行数、字数和字符数,但是当我开始运行程序时,它告诉我“对象#\1不适用。”“1”是我正在读取的文件中的第一个字符,它应该在“else”下。我所看到的一切都与我的案例陈述相符,所以我认为我做得对,但很明显,某个地方出了问题。谢谢你的帮助 (define files (lambda (reading n) (begin (define in (open-input-file reading)
(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”。谢谢!这解决了一个问题,但现在我有了另一个问题……我可能可以通过显示等方式找到这个新的端口。如果这个答案对你有效,你应该“接受”通过单击答案旁边的复选标记进行编辑。请注意。