gpt4 book ai didi

common-lisp - 退出而不丢失缓存的输出

转载 作者:行者123 更新时间:2023-12-03 15:06:06 26 4
gpt4 key购买 nike

我正在尝试向我正在编写的程序添加一项功能,通过该功能,打印到控制台的所有内容也会添加到日志文件中。广播流可以做到这一点。问题是程序可能还需要从叶函数中突然退出,当我这样做时,日志文件不会被创建。这是我目前所拥有的:

(catch 'quit
(with-open-file (log-stream "log.txt"
:direction :output
:if-exists :supersede
:if-does-not-exist :create)
(let ((*standard-output*
(make-broadcast-stream *standard-output* log-stream)))
(format t "abc~%")
(throw 'quit nil))))

当我运行上面的代码(SBCL 1.4.2,Windows 7)时,文件 log.txt 没有被创建。如果我将 (throw 'quit nil) 替换为 (quit),情况也是如此。但是,如果我完全删除该行并让程序退出文件末尾,则日志文件会正确创建,这表明这是一个缓存问题。

这是正确的诊断吗?如果是这样,有没有办法告诉编译器不要缓存该文件,或者退出而不是不写入缓存数据?

最佳答案

这是 WITH-OPEN-FILE 标准中描述的行为:

If a new output file is being written, and control leaves abnormally, the file is aborted and the file system is left, so far as possible, as if the file had never been opened.

以下明确关闭文件:

(catch 'quit
(with-open-file (log-stream "/tmp/log.txt"
:direction :output
:if-exists :supersede
:if-does-not-exist :create)
(let ((*standard-output* (make-broadcast-stream *standard-output* log-stream)))
(unwind-protect (progn
(format t "abc~%")
(throw 'quit nil))
(finish-output)
(close log-stream :abort nil)))))

:abort nil 值是默认值,这里明确表示是为了回答问题。

关于common-lisp - 退出而不丢失缓存的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com