当列表中的#<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
,则可以简单地将一个新字符附加到列表的末尾。
我有一些代码可以读取文件并将其转换为字符列表
(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
,则可以简单地将一个新字符附加到列表的末尾。