我的程序目前在整个程序中使用write-byte
写入字节。
当程序中出现错误时,程序会在那里停止,但我意识到这仍然会留下先前写入的字节(在遇到错误之前)。
我想知道是否有可能保留我想要输出的所有字节,直到程序成功结束,以便如果程序在程序结束之前遇到错误,它不输出任何内容,如果没有遇到错误,那么我可以输出我想要写入的所有字节。
您可以将程序封装在with-output-to-bytes
中以产生字节串值,而不是直接写入stdout:
(with-output-to-bytes
(λ ()
(write-bytes #"a")
(write-bytes #"b")))
在内部,这只是一个围绕open-output-bytes
和current-output-port
的参数化的超级简单的包装,所以如果您想要更细粒度的控制,您可以直接使用它们。例如,如果您有一个简单的脚本,并且不想包装整个程序,您可以全局地改变current-output-port
参数:
(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)
但是,要小心:像这样改变current-output-port
将影响所有打印的内容,包括在模块级别求值的表达式的输出,这就是为什么有必要将write-bytes
调用与上面的void
包装在一起。
可以将字节添加到列表中,然后将它们一起打印:
(define lst '())
(set! lst (cons #"a" lst))
(set! lst (cons #"b" lst))
(println lst)
(for ((item (reverse lst)))
(write-bytes item))
输出:'(#"b" #"a")
ab
List必须反转,因为'cons'将item添加到列表的头部。