Чтение ссылки:
read-char : "Считывает один символ из in
- что может включать чтение нескольких байтов для декодирования UTF-8их в символ. Если байты недоступны до конца файла, то возвращается eof
."
read-string: "Возвращает строку, содержащую следующие amt
символов из in
. Если до конца файла нет доступных символов, возвращается eof
. "
Примеры:
> (read-char (open-input-string "char"))
#\c
> (read-string 50 (open-input-string "the string"))
"the string"
>
Но если в буфере нет символов, вы получите eof
:
> (read-char (open-input-string ""))
#<eof>
> (read-string 50 (open-input-string ""))
#<eof>
Я думаю, вы просто хотите прочитать некоторое количество символов в цикле и что-то с ними сделать.Если это так, решение будет выглядеть следующим образом:
(define (another-process inp)
(let ([c (read-char inp)])
(if (eof-object? c)
(begin (display "==== EOF ====") (newline))
(begin (display c) (newline)
(another-process inp)))))
Пример:
> (another-process (open-input-string "OK"))
O
K
==== EOF ====
> (another-process (open-input-string ""))
==== EOF ====
>
Обратите внимание на второй вызов another-process
с пустой строкой, он обнаружит eof
немедленно и выходит из цикла.
РЕДАКТИРОВАТЬ: В случае, если вам нужно проверить, является ли символ чтения новой строки:
(define (process-moo inp)
(let ([c (read-char inp)])
(cond
((eof-object? c)
(display "==== EOF ====") (newline))
((eq? c #\newline)
(newline) (display "---- NEWLINE ----") (newline)
(process-moo inp))
(else
(display c)
(process-moo inp)))))
Пример:
> (call-with-input-string "Hello\nhumans\n!" process-moo)
Hello
---- NEWLINE ----
humans
---- NEWLINE ----
!==== EOF ====
>
Надеюсь, это поможет.