Я не понимаю, почему этот код ведет себя по-другому в различных реализациях:
(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?
Вам нужно использовать Finish-Expution
.
В системах с буферизованными выходными потоками некоторые выходные данные остаются в выходном буфере, пока выходной буфер не будет полностью (тогда он будет автоматически записан в пункт назначения), либо выходной буфер выпускается.
Common Lisp имеет три функции для этого:
Вывод отделки
, попытки убедиться, что все вывод выполняется, а затем возвращает.
Вывод Force
, начинает оставшийся выход, но немедленно возвращает и не ждет, пока все вывод выполняется.
Очистить выход
, пытается удалить любой ожидающий выход.
Также T
в Force-production
и формат
, к сожалению, не одинаково.
Вывод Force
/ Вывод финиш
: T
T
* Terminal-io *
и nil
* Формат стандартного выхода *
: T
* Стандартный выход *
Это должно работать:
(format t "asdf")
(finish-output nil) ; note the NIL
(setq var (read))