Как обрабатывать входные и выходные потоки в 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 что повесил.

Ответы на вопрос(3)

Ваш ответ на вопрос