2010-08-06 7 views
6

Tengo el siguiente código de Common Lisp:¿Cuándo se imprime el formato en Common Lisp?

(defun micro-read-eval-print() 
    (format t "Micro > ") 
    (let ((form (read-line))))) 

Cuando lo ejecuto, me sale el siguiente:

CL-USER> (micro-read-eval-print) 
(m-quote a) 
Micro > NIL 

Tenga en cuenta que he escrito en "(m-cotización a)", mientras que el Interpretación del intérprete Lisp "Micro> NIL".

Ahora, habría esperado que estos eventos sucedieran en el orden inverso. Hubiera esperado que "Micro>" se imprimiera primero, ya que la declaración de formato es lo primero. ¿Por qué no se imprime primero? ¿Y qué debo hacer para asegurarme de que se imprima primero?

Respuesta

11

Trate de añadir

(defun micro-read-eval-print() 
    (format t "Micro > ") 
    (finish-output) 
    (let ((form (read-line))))) 

Creo que se está encontrando el búfer de io estándar (stdio) que, en C, que comúnmente se pasa por alto a través de fflush() en ese idioma.

finish-output parece ser el equivalente de Common Lisp de la biblioteca estándar de C fflush.

+4

Correcto, las implementaciones pueden usar flujos de E/S almacenados en búfer y no es necesario forzar la salida después de un formato o antes de una lectura. Entonces, para el código portátil uno tiene que llamar algo como salida de fuerza o salida final. –