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

Mik*_*012 1 stdout common-lisp ccl

我试图永久地将stdout重定向到一个文件,但我可以找到关于这样做的所有示例都涉及使用标准输出全局在let或内部打开文件中执行此操作.有没有办法可以进行应用程序范围的重定向?

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

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

这会停止输出到REPL,但是没有任何内容显示在probe-file打印调用中的文件中(确实存在并且可以看到).

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

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

(format t "hello")
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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

sds*_*sds 5

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

(force-output *log*)
Run Code Online (Sandbox Code Playgroud)

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

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

实际上,如果你想保存你的会话日志(即,将REPL保留在屏幕上并将成绩单保存到文件中),标准设施就是dribble- 试试吧!