我正在阅读 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))))
答案 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*))