Racket 当#<;eof>;列表中

Racket 当#<;eof>;列表中,racket,eof,Racket,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

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

(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>)
(在(打开输入文件“some file.txt”)中定义)
(定义(文件->字符列表inp)
;将输入文件转换为字符列表
(let([内容(读取字符inp)])
(如果(eof对象?内容)
(列表eof)
(cons内容(文件->字符列表inp‘‘‘‘)’)
(定义字符列表(文件->中的字符列表)
(println字符列表)

读取语法:错误语法“#在典型的现代操作系统上,文件中没有文件结尾字符。相反,当某个文件I/O操作到达文件结尾时,操作系统会发出信号。为了使此信号有效,必须向I/O操作的调用者返回一个唯一的值,该值可以与可能接收到的任何有效数据。对于Racket,此值为,这是一个表示文件结尾的不同值

>代码> EOF对象被打印为AN;您不希望读者在程序中间遇到文件末尾。当您在RePL中输入<代码> EOF时,符号<代码> EOF>代码将计算到文件对象的末尾,该文件通常会被打印为不可读取的值,使用<代码> > <代码>。o读者,比如说,通过将其包含在带有

”(#s#o#m#e#e#space#t#e#x#t#
)的引用列表中,读者会抱怨。这是应该的

我想不出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
在某种程度上,一个新字符可以简单地添加到列表的末尾。

您上面粘贴的代码对我来说很有用。您是否对可能产生错误的结果做了任何其他操作?我正在尝试为我正在处理的项目标记html元素。在html规范中,eof的处理方式不同y取决于遇到eof时lexer所处的状态。我以前从未处理过不可读的值。在此之前,我从未处理过这些值。但现在我知道#不是我可以直接处理的值,我将使用“()”作为代理。我感谢您的解释!