1

我正在尝试将 stdout 永久重定向到一个文件,但我能找到的所有关于这样做的示例都涉及在 let 或使用标准输出全局的 with-open-file 中这样做。有没有办法可以进行应用程序范围的重定向?

编辑:这是我尝试使用标准输出进行重定向的方式:

(Setf *log* (open "/Users/Mike/Desktop/some.txt" :direction :output :if-exists :append))
(Setf *standard-output* *log*)
(print "Test")

probe-file这会停止向 REPL 的输出,但print 调用中的文件(确实存在并且被 看到)中没有显示任何内容。

编辑:我试过使用 Dribble 功能:

(Dribble "/Users/Mike/Desktop/some.txt")

(format t "hello")

但我收到以下错误:

错误:通用函数没有适用的方法:#STANDARD-GENERIC-FUNCTION CCL::STREAM-SET-COLUMN #x30200006557F 使用参数调用时:(#0) 执行时:#,正在处理 Listener(11)。键入 cmd-/ 继续,cmd-。要中止,cmd-\ 以获取可用重新启动的列表。如果继续:尝试再次调用它类型:?其他选项。

4

1 回答 1

5

我认为您的问题与缓冲有关。尝试force-output

(force-output *log*)

请注意,关闭流会自动刷新缓冲区,而 lisps 通常会在正常退出时关闭流,因此实际上不会丢失任何内容,只是需要一些时间才能出现在磁盘上。

此外,请注意,Common Lisp REPL 交互是通过许多不同的流变量完成的,而不仅仅是一个(尽管其中许多是其他变量的别名)。

实际上,如果您想保存会话日志(即,将 REPL 保留在屏幕上并将脚本保存到文件中),标准工具由提供dribble- 试试看!

于 2014-06-18T21:47:56.980 回答