当列表中的#<eof> 时球拍语法错误

Racket bad syntax error when #<eof> in a list

我有一些代码可以读取文件并将其转换为字符列表

(define in (open-input-file "some-file.txt"))

(define (file->char-list inp)
  ;; convert the input file into a list of chars
  (let ([content (read-char inp)])
    (if (eof-object? content)
    (list eof)
    (cons content (file->char-list inp)))))

(define char-list (file->char-list in)

(println char-list)

 read-syntax: bad syntax `#<`
'(#\s #\o #\m #\e #\space #\t #\e #\x #\t #<eof>)

但问题是文件中的eof 给出了错误的语法错误。我需要将 eof 放在列表中,因为我打算用它做一些事情,但我很惊讶我收到了错误,因为这些值被引用了,当我在 repl 中评估 eof 时,我也得到了# .有谁知道我能做什么?

在典型的现代操作系统上,文件中没有文件结束字符。相反,当某些文件 I/O 操作到达文件末尾时,操作系统会发出信号。为了使此信号有效,必须向 I/O 操作的调用方返回一个唯一值,该值可以与可能收到的任何有效数据区分开来。对于 Racket,此值为 eof,这是一个不同的值,表示文件结束。

eof 对象打印为 unreadable value;您不希望 reader 在程序中间遇到文件结尾。当您在 REPL 中输入 eof 时,符号 'eof 的计算结果为文件末尾对象,通常会使用 #<eof> 打印为不可读的值。如果您尝试将 #<eof> 提供给 reader,例如将其包含在带有 '(#\s #\o #\m #\e #\space #\t #\e #\x #\t #<eof>) 的引号列表中,reader 将会抱怨。这是应该的。

我想不出有什么理由让 OP 需要处理到达文件末尾时返回的 eof 对象。 OP 也可以做类似的事情:

(define (file->char-list inp)
  ;; convert the input file into a list of chars
  (let ([content (read-char inp)])
    (if (eof-object? content)
        '()
        (cons content (file->char-list inp)))))

使用以下人员创建的列表时:

(define char-list (file->char-list in))
char-list  ==>  '(#\s #\o #\m #\e #\space #\t #\e #\x #\t)

已知当到达列表末尾时到达文件末尾。如果 OP 想以某种方式 "transform" eof,则可以简单地将一个新字符附加到列表的末尾。