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-c
Es 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ürgrep
macht 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.