Формат Lisp и принудительный вывод
Я не понимаю, почему этот код ведет себя по-разному в разных реализациях:
(format t "asdf")
(setq var (read))
В CLISP он ведет себя так, как и ожидалось, с напечатанной подсказкой, за которой следует чтение, но в SBCL он читает, а затем выводит. Я прочитал немного в Интернете и изменил это:
(format t "asdf")
(force-output t)
(setq var (read))
Это, опять же, прекрасно работает в CLISP, но в SBCL он все еще читает, а затем выводит. Я даже попытался разделить его на другую функцию:
(defun output (string)
(format t string)
(force-output t))
(output "asdf")
(setq var (read))
И это все еще читает, затем выводит. Я не использую force-output
правильно или это просто особенность SBCL?
1 ответ
Вам нужно использовать FINISH-OUTPUT
,
В системах с буферизованными выходными потоками некоторые выходные данные остаются в выходном буфере до тех пор, пока выходной буфер не будет заполнен (тогда он будет автоматически записан в место назначения) или пока выходной буфер не будет очищен.
Common Lisp для этого имеет три функции:
FINISH-OUTPUT
, пытается убедиться, что все выходные данные сделаны, а затем возвращается.FORCE-OUTPUT
, запускает оставшийся вывод, но НЕМЕДЛЕННО возвращается и НЕ ожидает завершения всех выводов.CLEAR-OUTPUT
, пытается удалить любой ожидающий вывод.
Так же T
в FORCE-OUTPUT
а также FORMAT
к сожалению, не то же самое.
force-output
/finish-output
:T
является*terminal-io*
а такжеNIL
является*standard-output*
FORMAT
:T
является*standard-output*
это должно работать:
(format t "asdf")
(finish-output nil) ; note the NIL
(setq var (read))