Lisp 如何检测输入流是否为空(但不是EOF)?

Lisp 如何检测输入流是否为空(但不是EOF)?,lisp,gnuplot,common-lisp,sbcl,Lisp,Gnuplot,Common Lisp,Sbcl,我正在从公共Lisp程序(gnuplot)生成一个进程。我能够为流程建立输入和输出流。但是,我在读取输出时遇到问题。问题是我想试着从输出中读取,如果那里什么都没有,那么。。。例如,什么都不做 (基本问题:我想读取命令show term的结果,但我想跳过gnuplot在发送此命令之前可能产生的任何其他输出) 如果我只使用(读取行gnuplot output nil:eof),而输出流中没有任何内容,它将不会指示:eof(因为流仍然处于活动状态,并且可能会在其中出现某些内容),而只会阻塞,直到有一些

我正在从公共Lisp程序(gnuplot)生成一个进程。我能够为流程建立输入和输出流。但是,我在读取输出时遇到问题。问题是我想试着从输出中读取,如果那里什么都没有,那么。。。例如,什么都不做

(基本问题:我想读取命令
show term
的结果,但我想跳过gnuplot在发送此命令之前可能产生的任何其他输出)

如果我只使用
(读取行gnuplot output nil:eof)
,而输出流中没有任何内容,它将不会指示
:eof
(因为流仍然处于活动状态,并且可能会在其中出现某些内容),而只会阻塞,直到有一些内容要读取(即永远)

有没有办法检测到没有东西可读?至少,在某种程度上可以安全地使读取尝试超时(即,一旦达到超时,就不应该从流中弹出新行)

另外,我正在使用SBCL

应该告诉您是否有可用字符。我认为您必须一个字符一个字符地读取流,而不是一次读取整行,除非您确定程序不会输出不完整的行

编辑:快速测试(使用sb ext运行程序):

其中output-test.sh为:

#!/bin/sh
for item in *
do
    echo $item
    sleep 3
done

使用
read char no hang
,您不需要使用
listen
。此外,将变量绑定从外部的
let
/
let*
折叠到内部的
do
/
do*
,就像您在一次编辑中所做的那样,这会妨碍代码的可读性和可维护性,只会节省一些字符。
程序
输出流
在循环中都不会变化,因此将它们放在外部的
let
/
let*
中会使这一点变得明显。@acalent
侦听
是检查是否有任何内容要读取,而不是读取。仅使用
readcharno-hang
将消耗输入的第一个字符,使逻辑更加复杂。至于将变量绑定放在一个单独的
let
中,我起初确实认为这会更清楚,但后来发现,由于循环应该一直运行到程序退出,因此在循环初始化中启动程序是有意义的。这样子进程的整个生命周期都在一个地方。
#!/bin/sh
for item in *
do
    echo $item
    sleep 3
done