Как изменить этот код для поддержки CCL? - PullRequest
3 голосов
/ 05 февраля 2012

Кажется, что НЕТ стандартного способа ANSI выполнить внешнюю программу и получить ее вывод, как это делает следующий специальный код SBCL:

(defmacro with-input-from-program ((stream program program-args environment)
                               &body body)
"Creates an new process of the specified by PROGRAM using
 PROGRAM-ARGS as a list of the arguments to the program. Binds the
 stream variable to an input stream from which the output of the
 process can be read and executes body as an implicit progn."
#+sbcl
(let ((process (gensym)))
    `(let ((,process (sb-ext::run-program ,program
                                      ,program-args
                                      :output :stream
                                      :environment ,environment
                                      :wait nil)))
   (when ,process
     (unwind-protect
          (let ((,stream (sb-ext:process-output ,process)))
            ,@body)
       (sb-ext:process-wait ,process)
       (sb-ext:process-close ,process))))))

Следующий код CCL сообщает «ОШИБКА: значение # не соответствует ожидаемому типу (И CCL :: BINARY-STREAM INPUT-STREAM)»

 #+clozure
 (let ((process (gensym)))
  `(let ((,process (ccl:run-program "/bin/sh" (list "-c" (namestring ,program))
                                    :input nil :output :stream :error :stream
                                    :wait nil)))
   (when ,process
     (unwind-protect
          (let ((,stream (ccl::external-process-output-stream ,process)))     
            ,@body)
       ;(ccl:process-wait (ccl:process-whostate ,process) nil)
       (close (ccl::external-process-output-stream ,process))
       (close (ccl::external-process-error-stream ,process))))))

Я немного знаю CCL. Я хочу знать, как я могу изменить этот код для поддержки CCL?

Любое предложение приветствуется!

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Видимо trivial-shell:shell-command не разрешает именно то, что вы хотите (он выполняет внешнюю команду синхронно и возвращает весь вывод).

Вы можете посмотреть в CCL run-program. См:

1 голос
/ 05 февраля 2012

Вы должны использовать trivial-shell .

Trivial shell - простой независимый от платформы интерфейс к базовой операционной системе.

...