Ошибка схемы - PullRequest
       20

Ошибка схемы

0 голосов
/ 31 марта 2012

Я пытаюсь создать программу подсчета слов в схеме.Я думаю, что я разработал алгоритм, который будет подсчитывать мои строки, слова и символы, но когда я начинаю запускать программу, она говорит мне: «Объект № \ 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 ]

2 голосов
/ 01 апреля 2012

К счастью, вашу проблему легко решить. Вы написали:

(case (port) ...)

но это делает case в результате вызова функции port. Конечно, port это не функция, это персонаж, поэтому вы просто хотите:

(case port ...)
0 голосов
/ 04 апреля 2012

Как "let loop" узнает, когда вы достигли конца файла? Что возвращает read-char, когда достигает конца? Подсказка: читайте про eof-объект? сказуемое. Предикат - это функция, которая возвращает #t или #f. Возможно, вам придется использовать cond, а не регистр, чтобы использовать этот предикат

Кроме того, переменные строк, символов и слов являются локальными по отношению к именованному let, поэтому вы не сможете затем распечатать его "снаружи". (Подсказка: напечатайте их внутри цикла, когда (eof-object? Port) возвращает # t.

Стиль quibble: не используйте имя "порт" для символа, который возвращает read-char. «in» - это порт (дескриптор файла), возможно, вы можете использовать «ch» вместо «port».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...