Состояние новой строки после прочтения строки с подсказкой не обновляется - PullRequest
1 голос
/ 08 марта 2012

Я использую GNU CLISP и схожу с ума, потому что эта программа:

(read-line)
(format t "~&<prompt RESPONSE")

Выводит что-то вроде:

my input...
<prompt RESPONSE

Но если я распечатываю подсказку раньше (read-line), яполучить ложную пустую строку:

(format t "~&prompt> ")
(read-line)
(format t "~&<prompt RESPONSE")

Например:

prompt> my input...

<prompt RESPONSE

Я пытался использовать (финишный вывод) как до, так и после чтения строки, но это не помогло.Я не понимаю, откуда эта пустая строка.Я подозреваю, что в CLISP есть ошибка.

1 Ответ

2 голосов
/ 09 марта 2012

Для тех, кто не знает, ~& в команде 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")
...