2016-07-15 24 views
2

我在看書Practical Common Lisp。我輸入了第3章中顯示的簡單CD數據庫。請參見下文。當我運行(add-cds)程序的結果是包含在彼此頂部兩個提示提示(更確切地說,一個又一個提示,在同一行):輸出提示相互排列

(add-cds) 
=> Title: Artist: 

爲什麼這樣做呢?該程序應該給我Title:提示首先和Artist:提示只有在輸入Title:後跟換行符的值。我很確定我忠實地輸入了節目。我該如何解決?

(defvar *db* nil) 

(defun make-cd (title artist rating ripped) 
    (list :title title :artist artist :rating rating :ripped ripped)) 

(defun add-record (cd) (push cd *db*)) 

(defun prompt-read (prompt) 
    (format *query-io* "~a: " prompt) 
    (force-output *query-io*) 
    (read-line *query-io*)) 

(defun prompt-for-cd() 
    (make-cd 
    (prompt-read "Title") 
    (prompt-read "Artist") 
    (or (parse-integer (prompt-read "Rating") :junk-allowed t) 0) 
    (y-or-n-p "Ripped [y/n]"))) 

(defun add-cds() 
    (loop (add-record (prompt-for-cd)) 
     (if (not (y-or-n-p "Another? [y/n]: ")) (return)))) 
+1

作品,你使用的是什麼實現,並在其操作系統爲我好與SBCL在OS X上? – uselpa

+0

我在Windows 10上使用LispIDE。 –

+1

在CCL上也能正常工作。 – Renzo

回答

3

發生的事情是,(add-cds)之後的換行符被留在輸入流中(因爲REPL停止只要它看到匹配的右括號閱讀),所以第一個read-line被讀取爲空白行並立即返回。致電clear-input,然後致電read-line忽略此操作並等待新輸入。

(defun prompt-read (prompt) 
    (format *query-io* "~a: " prompt) 
    (force-output *query-io*) 
    (clear-input *query-io*) 
    (read-line *query-io*)) 
+0

謝謝,但補充說清楚輸入沒有影響。我在想LispIDE有一個bug。 –

+1

如果輸入是空字符串,您可以嘗試使用重複的循環。 – Barmar