2010-08-06 2 views
6

Ich habe folgende Common Lisp Code:Wann Druckformat tatsächlich in Common Lisp?

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

Wenn ich es laufen, erhalte ich folgendes:

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

Bitte beachte, dass ich eingegeben "(m-Zitat a)", während die Lisp Interpreter Ausgabe "Micro> NIL".

Nun würde ich diese Ereignisse zu erwarten in der umgekehrten Reihenfolge geschehen. Ich hätte erwartet, dass "Micro>" zuerst gedruckt wurde, da die Formatanweisung zuerst kommt. Warum wird es nicht zuerst gedruckt? Und was muss ich tun, um sicherzustellen, dass es zuerst gedruckt wird?

Antwort

11

Versuchen Zugabe

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

Ich glaube, Sie die Pufferung von Standard-io stoßen (stdio), die in C, wird üblicherweise über fflush() in dieser Sprache umgangen.

finish-output scheint das Common Lisp-Äquivalent der C-Standardbibliothek fflush zu sein.

+4

Recht kann Implementierungen IO-Streams gepuffert verwenden und muß nicht ausgegeben, nachdem ein Format erzwingen oder vor einem Lese. Also muss man für den portablen Code etwas wie Force-Output oder Finish-Output nennen. –