Estoy tratando de averiguar cómo usar la secuencia de salida de un programa. Empiezo con RUN-PROGRAM
para que pueda usarse como la entrada de otro programa iniciado con RUN-PROGRAM
(es decir, el equivalente moral y quizás literal de la tubería). He intentado utilizar una serie de combinaciones de los argumentos de palabras clave :INPUT
, :OUTPUT
y :WAIT
, pero nada de lo que haya pulsado ha sido productivo hasta el momento. Cualquier consejo sería de ayuda; por ejemplo, ¿cómo haré para hacer algo como ls | grep lisp
desde el caparazón?Cómo procesar flujos de entrada y salida en Steel Bank Common Lisp?
Una de mis intentos es
(defun piping-test()
(let ((grep-process (run-program "/usr/bin/grep" '("lisp")
:input :stream
:output :stream)))
(unwind-protect
(with-open-stream (s (process-input grep-process))
(let ((ls-process (run-program "/bin/ls" '()
:output s)))
(when ls-process
(unwind-protect
(with-open-stream (o (process-output grep-process))
(loop
:for line := (read-line o nil nil)
:while line
:collect line))
(process-close ls-process)))))
(when grep-process (process-close grep-process)))))
La ejecución de este en un BABA REPL hace todo lo posible para colgar hasta que rompa con C-c C-c
, así que no es bastante obvio lo correcto, pero estoy no está seguro de cómo cambiarlo para que sea lo correcto.
EDIT: Adición de:WAIT NIL
a ambos RUN-PROGRAM
invocaciones, o solamente a la invocación de grep
, no hacer el truco. En ese caso, la función se bloqueará, y romper con C-c C-c
obtiene un seguimiento de la pila que indica que hay una función local (definida a través de FLET
) llamada SB-UNIX:SELECT
que se colgó.