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- \以获取可用重新启动的列表.如果继续:尝试再次调用类型:?其他选择.
我认为你的问题与缓冲有关.试试force-output:
(force-output *log*)
Run Code Online (Sandbox Code Playgroud)
请注意,关闭流会自动刷新缓冲区,而lisps通常会在正常退出时关闭流,因此实际上没有任何内容丢失,只需要时间就可以显示在磁盘上.
另外,请注意Common Lisp REPL交互是通过许多不同的流变量完成的,而不只是一个(尽管其中许多是别人的别名).
实际上,如果你想保存你的会话日志(即,将REPL保留在屏幕上并将成绩单保存到文件中),标准设施就是dribble- 试试吧!
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |