2012-11-18 156 views
3

我有一個循環:爲什麼此循環打印上次迭代的值?

(defun echo-lines() 
    (loop while 
     (let ((line (read-line))) 
      (if (equal line "done") 
       nil 
       (print line))))) 

我預計他們結束行之後呼應了用戶的輸入,除非他們鍵入「完成」,在這種情況下,它停止。相反,它首次迴響了一條空白線,之後,它迴應了之前的一條輸入。 實施例:

* (echo-lines) 
Hello, loop. 

This is my second line. 
"Hello, loop." 
This is my third. 
"This is my second line." 
I'm almost done. 
"This is my third." 
done 
"I'm almost done." 
NIL 

預期:

* (echo lines) 
Hello, loop. 
"Hello, loop." 
done 
NIL 

回答

7

效果通過緩衝的輸出的混合和PRINT定義而引起的。

PRINT如果底層輸出流被緩衝,則不會立即寫入輸出。還要注意,PRINT首先打印新行。請注意,對於可移植代碼,您應該假設輸出流被緩衝。這意味着您需要確保在需要時寫入緩衝輸出。使用FORCE-OUTPUT(不等)和FINISH-OUTPUT(等待)。

這是一個稍微改寫的版本。

(defun echo-lines() 
    (loop for line = (read-line) 
     until (equal line "done") 
     do 
     (write-line line) 
     (finish-output))) 
+0

這清楚地回答了我的問題,並提供了正確的解決方案。謝謝! =] – derekv

相關問題