Io Racket:存储字节,然后在程序结束时全部输出

Io Racket:存储字节,然后在程序结束时全部输出,io,byte,racket,Io,Byte,Racket,我的程序当前在整个程序中使用write byte写入字节。 当程序中出现错误时,程序会停止,但我意识到这仍然会保留以前写入的字节(在遇到错误之前) 我想知道是否有可能保留我想要输出的所有字节,直到程序成功结束,这样如果程序在程序结束前遇到错误,它就不会输出任何内容,如果没有遇到错误,然后,我可以输出我想要写入的所有字节。您可以将程序包装成bytestring值,而不是直接写入标准输出: (with-output-to-bytes (λ () (write-bytes #"a")

我的程序当前在整个程序中使用
write byte
写入字节。
当程序中出现错误时,程序会停止,但我意识到这仍然会保留以前写入的字节(在遇到错误之前)


我想知道是否有可能保留我想要输出的所有字节,直到程序成功结束,这样如果程序在程序结束前遇到错误,它就不会输出任何内容,如果没有遇到错误,然后,我可以输出我想要写入的所有字节。

您可以将程序包装成bytestring值,而不是直接写入标准输出:

(with-output-to-bytes
  (λ ()
    (write-bytes #"a")
    (write-bytes #"b")))

在内部,这只是一个超级简单的包装器和的参数化,所以如果您想要更细粒度的控制,可以直接使用它们。例如,如果您有一个简单的脚本,并且不想包装整个程序,则可以全局修改
当前输出端口
参数:

(define stdout (current-output-port))
(define output (open-output-bytes))
(current-output-port output)

(void
 (begin
   (write-bytes #"a")
   (write-bytes #"b")))

(write-bytes (get-output-bytes output) stdout)

但是,要小心:像这样改变
当前输出端口
将影响打印的所有内容,包括在模块级别计算的表达式的输出,这就是为什么必须用上面的
void
包装
write bytes
调用。

可以将字节添加到列表中,然后一起打印:

(define lst '())

(set! lst (cons #"a" lst))
(set! lst (cons #"b" lst))

(println lst)

(for ((item (reverse lst)))
  (write-bytes item))
输出:

'(#"b" #"a")
ab
由于“cons”将项目添加到列表的开头,因此列表必须颠倒