当列表中出现#<efoF>时,出现 Racket 语法错误。

问题描述 投票:1回答:1

我有一些代码,可以读取一个文件,并将其变成一个字符列表。

(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在列表中,因为我打算用它来做一些事情,但我很惊讶我得到了这个错误,因为这些值是被引用的,而当我评估 eof 在补充我也得到#。有人知道我能做什么吗?

racket eof
1个回答
1
投票

在典型的现代操作系统上,文件中没有文件结束符。相反,当通过一些文件IO操作达到文件结束时,操作系统会发出信号。为了使这个信号有效,必须返回一个唯一的值给IO操作的调用者,这个值可以从任何可能收到的有效数据中区分出来。在 Racket 的情况下,这个值就是 eof,这是一个代表文件结束的独特值。

eof 对象被打印成一个 不可读物;你不希望读者在程序中间遇到文件结束的情况。当你进入 eof 在REPL,符号 'eof 评估为文件结束对象,通常会被打印成一个不可读的值,用 #<eof>. 如果你想给 #<eof> 读者,比如说把它列入一个引用列表,并在列表中加入 '(#\s #\o #\m #\e #\space #\t #\e #\x #\t #<eof>),读者会抱怨。这是应该的。

我想不出上位者有什么理由需要与之合作。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 以某种方式,一个新的字符可以简单地附加到列表的最后。

© www.soinside.com 2019 - 2024. All rights reserved.