我正在尝试永久地将stdout重定向到一个文件,但我可以找到关于这样做的所有示例都涉及使用标准输出在let或内部打开文件中执行此操作全球。有没有办法可以进行应用程序范围的重定向?
编辑:以下是我尝试使用标准输出进行重定向的方法:
(Setf *log* (open "/Users/Mike/Desktop/some.txt" :direction :output :if-exists :append))
(Setf *standard-output* *log*)
(print "Test")
这会停止输出到REPL,但是打印调用中的任何内容都没有显示(probe-file
}确实存在并且没有显示。
编辑:我尝试过使用Dribble功能:
(Dribble "/Users/Mike/Desktop/some.txt")
(format t "hello")
但是我收到以下错误:
错误:通用函数没有适用的方法: #STANDARD-GENERIC-FUNCTION CCL :: STREAM-SET-COLUMN#x30200006557F 用参数调用时: (#0) 在执行Listener(11)时执行:#。 键入cmd- /继续,cmd-。要中止,cmd- \以获取可用重新启动的列表。 如果继续:尝试再次呼叫它 类型:?其他选择。
答案 0 :(得分:5)
我认为你的问题与缓冲有关。
试试force-output
:
(force-output *log*)
请注意,关闭流会自动刷新缓冲区,而lisps通常会在正常退出时关闭流,因此实际上没有任何内容丢失,只需要时间就可以显示在磁盘上。
此外,请注意Common Lisp REPL交互是通过many different stream variables完成的,而不只是一个(尽管其中很多是别人的别名)。
实际上,如果您想保存会话日志(即将REPL保留在屏幕上并将文字保存到文件中),标准工具由dribble
提供 - 试试吧!