es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  

Answer

  1. Avatar for 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 cada format para vaciar cualquier salida almacenada en búfer al flujo. Luego, después de que se haya terminado de ejecutar foo, se recupera la salida del flujo usando get-output-stream-string y se imprime.

Comments are closed.