Для тех, кто не знает, ~&
в команде format
- это условный перевод строки, что означает «напечатать перевод строки, если это необходимо». То есть печатать новую строку можно только в том случае, если последнее, что напечатал lisp, еще не было новой строкой.
Функция format
(по крайней мере, на вашем компьютере!) Игнорирует вводимые пользователем данные при принятии решения о выдаче новой строки. Это может быть не во всех системах. Я действительно не помню.
Давайте сосредоточимся на ~&
, который непосредственно предшествует <prompt RESPONSE
. В вашем первом случае format
видит, что он еще ничего не печатал и, следовательно, не нуждается в печати новой строки. Во втором случае format
видит, что последнее, что он напечатал, не было новой строкой, и поэтому ему нужно напечатать новую строку.
Решение: зная, что пользователь всегда будет вводить новую строку, не включайте его в ваше заявление format
. Вы даже можете удалить его из исходного приглашения, если хотите:
(format t "prompt> ")
(read-line)
(format t "<prompt RESPONSE")
Итак, тогда возникает вопрос: "Тогда что же такое ~&
?" И действительно, есть и другие варианты использования. Например, для разделения 2 последовательных строк вывода:
(format t "prompt> ")
(read-line)
(format t "<prompt RESPONSE 1~&<prompt RESPONSE 2")