2010-08-06 38 views
6

Tôi có đoạn code sau Common Lisp:Khi nào định dạng thực sự in trong Common Lisp?

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

Khi tôi chạy nó, tôi nhận được như sau:

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

Lưu ý rằng tôi gõ vào "(m-quote a)", trong khi Đầu ra thông dịch Lisp "Micro> NIL".

Bây giờ, tôi đã dự kiến ​​những sự kiện này sẽ xảy ra theo thứ tự ngược lại. Tôi đã có thể mong đợi "Micro>" đã được in đầu tiên kể từ khi tuyên bố định dạng đến trước. Tại sao nó không được in đầu tiên? Và tôi phải làm gì để đảm bảo nó được in trước?

Trả lời

11

Hãy thử thêm

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

Tôi tin rằng bạn đang gặp phải các đệm của io chuẩn (stdio) trong đó, C, thường được bỏ qua qua fflush() trong ngôn ngữ đó.

finish-output dường như là tương đương Lisp chung của thư viện chuẩn C fflush.

+4

Phải, việc triển khai có thể sử dụng các luồng IO được đệm và không cần ép buộc đầu ra sau một định dạng hoặc trước khi đọc. Vì vậy, đối với mã di động người ta phải gọi một cái gì đó như lực lượng đầu ra hoặc kết thúc-đầu ra. –

Các vấn đề liên quan