输出提示相互重叠

时间:2016-07-15 19:38:19

标签: common-lisp

我正在阅读 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 个答案:

答案 0 :(得分: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*))