2010-08-06 5 views
6

Mam następujący wspólny kod Lisp:Kiedy format faktycznie się drukuje w Common Lisp?

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

Kiedy go uruchomić, pojawia się następujący:

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

pamiętać, że wpisany w "(m-quote a)", natomiast Wyjście interpretera Lisp "Micro> NIL".

Teraz oczekiwałbym, że te wydarzenia się zdarzą w odwrotnej kolejności. Spodziewałbym się, że "Micro>" zostanie wydrukowane jako pierwsze, ponieważ deklaracja formatu jest najważniejsza. Dlaczego nie jest drukowany jako pierwszy? I co muszę zrobić, aby upewnić się, że zostanie wydrukowany pierwszy?

Odpowiedz

11

spróbuj dodać

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

wierzę napotkania buforowanie standardowym IO (stdio), który w C, jest powszechnie omijane poprzez fflush() w tym języku.

finish-output wydaje się być odpowiednikiem standardowej Lisp biblioteki standardowej C fflush.

+4

Dobrze, implementacje mogą wykorzystywać buforowane strumienie IO i nie wymagają wymuszania wyjścia po formacie lub przed odczytem. Tak więc dla przenośnego kodu trzeba wywołać coś takiego jak siła-wyjście lub zakończenie-wyjście. –