在常见的lisp中,打印到多个控制台的最佳方法是什么?

时间:2018-02-23 13:08:29

标签: common-lisp

我希望在同一进程下运行多个控制台。我想这样做:

(format console1 "foo") ;prints to iterm tab1
(format console2 "bar") ;prints to iterm tab2
(format t "baz") ;prints to slime repl

我也希望能够从所有3个流中读取。 Slime将保留标准REPL,但我想为2个术语构建自定义REPL

1 个答案:

答案 0 :(得分:4)

输出

使用MAKE-BROADCAST-STREAM。例如:

(setf *standard-output*
  (make-broadcast-stream *standard-output*
                         (open #P"/tmp/log.out" :direction :output)))

这会将所有标准输出重定向到由当前*standard-output*和新流组成的广播流,并在文件中写入。如果在此重定向后编写命令,则应该能够观察正在写入的文件。 另请注意,没有任何参数(make-broadcast-stream)是您通常构建接收器流的方式,有点像/dev/null

输入

从多个流中读取是不同的。如果它们同时发出输入,你如何决定应该优先考虑哪一个?您是否需要单独的线程并行读取输入并以同步方式推送到单个流中?