2010-08-06 6 views
6

J'ai le code Lisp commun suivant:Quand le format imprime-t-il réellement en Common Lisp?

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

Quand je cours, je reçois le texte suivant:

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

Notez que je tapé "(m-citation a)", alors que le Sortie interpréteur Lisp "Micro> NIL".

Maintenant, je m'attendais à ce que ces événements se produisent dans l'ordre inverse. Je m'attendais à ce que "Micro>" soit imprimé en premier puisque la déclaration de format vient en premier. Pourquoi n'est-il pas imprimé en premier? Et que dois-je faire pour m'assurer qu'il est imprimé en premier?

Répondre

11

Essayez d'ajouter

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

Je crois que vous rencontrez la mise en mémoire tampon de io standard (stdio) qui, en C, est souvent contournée par l'intermédiaire fflush() dans cette langue.

finish-output semble être l'équivalent Common Lisp de la bibliothèque standard C fflush.

+4

À droite, les implémentations peuvent utiliser des flux d'E/S bufférisés et n'ont pas besoin de forcer la sortie après un format ou avant une lecture. Donc, pour le code portable, il faut appeler quelque chose comme la sortie de force ou la sortie de sortie. –

Questions connexes