2016-07-15 23 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