Racket:存储字节,然后在程序结束时输出所有字节

时间:2016-10-13 17:24:27

标签: io byte racket

我的程序当前在整个程序中使用write-byte写入字节 当程序中出现错误时,程序停在那里但我已经意识到这仍然留下了先前写入的字节(在遇到错误之前)。

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

2 个答案:

答案 0 :(得分:2)

您可以将程序包装在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的{​​1}}调用。

答案 1 :(得分:-1)

可以在列表中添加字节并在以后一起打印:

(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'会将项目添加到列表的头部。