Как обрабатывать входные и выходные потоки в Steel Bank Common Lisp?
Я пытаюсь понять, как использовать поток вывода одной программы, с которой я начинаюRUN-PROGRAM
так что это может быть использовано как ввод другой программы, запущенной сRUN-PROGRAM
(то есть моральный и, возможно, буквальный эквивалент трубопровода). Я пытался использовать ряд комбинаций:INPUT
, :OUTPUT
а также:WAIT
ключевые аргументы, но ничего, с чем я столкнулся, до сих пор не было продуктивным. Любые советы будут полезны; например, как бы я сделал что-то вродеls | grep lisp
из скорлупы?
Одна из моих попыток
(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)))))
Запуск этого в SLIME REPL заставляет все зависать, пока я не порву сC-c C-c
так что, очевидно, это не то, что нужно, но я не уверен, как это изменить, так что это правильно.
РЕДАКТИРОВАТЬ: Добавление:WAIT NIL
как дляRUN-PROGRAM
вызовы, или только вызов дляgrep
не делает трюк. В этом случае функция будет зависатьC-c C-c
получает трассировку стека, указывающую, что есть локальная функция (определяется черезFLET
) называетсяSB-UNIX:SELECT
что повесил.