Common Lisp:写入外部程序输入

Common Lisp: Write to external program input

我想在 CL/CCL 中为 mpg123 控制台 mp3 播放器编写一个简单的包装器,想知道如何写入作为派生进程存在的 mpg123:

(let* ((p (run-program "mpg123" '("-R") :input :stream :output :stream :wait nil))
       (s (external-process-input-stream p)))

  (write "LOAD /path/to/file.mp3" :stream s)
  (write-char #\return s))

但是这段代码不起作用,我有点卡住了。有什么想法吗?

注意买者:我手头没有 Clozure 实例,我假设这个 run-program 来自 CCL 扩展。

几乎可以肯定,mpg123 可能“还没有”收到您的输出,因为在所有主流系统上 I/O 会(默认情况下)缓冲,直到您达到某个缓冲区大小限制.在 #'write-char 之后添加一个 (finish-output s) 可能会成功。

参见 http://clhs.lisp.se/Body/f_finish.htm — 如果您不关心立即阅读任何回复(例如,如果您正在循环排队很长的播放列表),force-output 可能更合适,但在实践中,它们在某种程度上可以互换。