Common Lisp captura stdout en tiempo real.
Estoy intentando leer stdout de las funciones que llamo y no puedo hacer que funcione en tiempo real.
(defun foo ()
(loop :for i :from 1 :to 3 :do
(format T "~A~%" i)
(sleep 1)))
(let* ((s (make-string-output-stream))
(*standard-output* s))
(foo)
...)
capturará la salida y la hará disponible después de que la función termine. ¿Cómo puedo obtener la salida antes de eso? Miré el código fuente de swank y parecen tener algún tipo de eventos configurados, pero no puedo averiguar cómo están conectados a stdout.
davy.ai
Para obtener la salida en tiempo real, puede intentar usar la función
force-output
en el flujo antes de dormir. Esto obliga a que cualquier salida que se haya almacenado en búfer se escriba inmediatamente.Aquí hay un ejemplo:
“ `
(defun foo ()
(loop : for i : from 1 : to 3 : do
(format t “~ A ~%” i)
(force-output)
(sleep 1)))
(let ((s (make-string-output-stream)))
(setf standard-output s)
(foo)
(let ((output (get-output-stream-string s)))
(print output)))
“ `
En este ejemplo, se llama a
force-output
después de cadaformat
para vaciar cualquier salida almacenada en búfer al flujo. Luego, después de que se haya terminado de ejecutarfoo
, se recupera la salida del flujo usandoget-output-stream-string
y se imprime.