Common Lisp와 외부 명령줄 사이의 배관

외부 프로그램 패키지를 사용하면 외부 명령줄 프로그램을 쉽게 호출하도록 코딩할 수 있습니다. 예를 들어:

(external-program:run "ls" '("-l") :output *standard-output*)


스트리밍(파이핑) 입력과 읽기 출력을 유지하려면 어떻게 합니까? (1) run 대신 start를 사용합니다.

(setf *x* (external-program:start "cat" '() :output :stream :input :stream))


(2) 출력을 읽기 위한 스레드를 만들고 인쇄합니다. Bordeaux-threads API는 POSIX와 매우 유사합니다.

(setf *read-thread*
      (bordeaux-threads:make-thread
       (lambda ()
     (loop for line = (read-line (external-program:process-output-stream *x*) nil)
           while line
           do (format t "OUT: ~A~%" line)))
       :name "titi"))


(3) 외부 프로그램에 데이터를 전달하기 위한 출력 스트림을 얻습니다.

(setf *out* (external-program:process-input-stream *x*))


(4) 나는 무엇인가를 쓰고 그것을 플래시한다.

(progn
  (loop for i from 1 to 10
    do (format *out* "!!! ~A~%" i))
  (force-output *out*))


이 단계에서 다음과 같은 (2) 단계의 일부 출력이 표시되어야 합니다.

OUT: !!! 1
OUT: !!! 2
...
OUT: !!! 10


계속 가지고 놀 수 있습니다.

(5) 그리고 마지막으로 모든 것을 청소합니다.

(close *out*)
(bordeaux-threads:join-thread *read-thread*)

좋은 웹페이지 즐겨찾기