当 # 在列表中时出现球拍错误语法错误<eof>



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

(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对象打印为不可读的值;您不希望读者在程序中间遇到文件结尾。在 REPL 中输入eof时,符号'eof的计算结果为文件末尾对象,该对象通常会打印为带有#<eof>的不可读值。如果你试图给读者#<eof>,比如把它包含在一个带有'(#s #o #m #e #space #t #e #x #t #<eof>)的引用列表中,读者会抱怨。这是应该的。

我想不出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想要以某种方式"转换"eof,则可以简单地将一个新字符附加到列表的末尾。

相关内容

最新更新