Формат 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?

12
задан Rainer Joswig 17 August 2015 в 18:31
поделиться

1 ответ

Вам нужно использовать 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))
24
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: