Wie verarbeite ich Ein- und Ausgabestreams in Steel Bank Common Lisp?

Ich versuche herauszufinden, wie der Ausgabestream eines Programms verwendet wird, mit dem ich beginneRUN-PROGRAM Damit kann es als Eingabe eines anderen Programms verwendet werden, mit dem begonnen wurdeRUN-PROGRAM (d. h. das moralische und vielleicht wörtliche Äquivalent von Rohrleitungen). Ich habe versucht, eine Reihe von Kombinationen der zu verwenden:INPUT, :OUTPUT und:WAIT Schlüsselwortargumente, aber nichts, auf das ich gestoßen bin, war bisher produktiv. Irgendwelche Tipps wären hilfreich; Wie würde ich zum Beispiel vorgehen, um so etwas zu tun?ls | grep lisp aus der schale?

Einer meiner Versuche ist

(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))))) 

Wenn Sie dies in einem SLIME REPL ausführen, bleibt alles hängen, bis ich mit dem Ergebnis abbrecheC-c C-cEs ist also offensichtlich nicht das Richtige, aber ich bin mir nicht sicher, wie ich es ändern soll, damit es das Richtige ist.

BEARBEITEN: Hinzufügen:WAIT NIL zu beidenRUN-PROGRAM Aufrufe oder nur den Aufruf fürgrepmacht den Trick nicht. In diesem Fall bleibt die Funktion hängen und bricht abC-c C-c Ruft einen Stack-Trace ab, der angibt, dass eine lokale Funktion vorhanden ist (definiert überFLET) namensSB-UNIX:SELECT das hat gehangen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage