永久重定向stdout到Common Lisp(CCL)中的文件

时间:2014-06-18 20:45:18

标签: common-lisp stdout ccl

我正在尝试永久地将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- \以获取可用重新启动的列表。   如果继续:尝试再次呼叫它   类型:?其他选择。

1 个答案:

答案 0 :(得分:5)

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

(force-output *log*)

请注意,关闭流会自动刷新缓冲区,而lisps通常会在正常退出时关闭流,因此实际上没有任何内容丢失,只需要时间就可以显示在磁盘上。

此外,请注意Common Lisp REPL交互是通过many different stream variables完成的,而不只是一个(尽管其中很多是别人的别名)。

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