13 Stimmen

Lisp-Format und Force-Output

Ich verstehe nicht, warum dieser Code sich in verschiedenen Implementierungen unterschiedlich verhält:

(format t "asdf")
(setq var (read))

In CLISP verhält es sich wie erwartet, mit der Ausgabe des Prompt gefolgt vom Lesen, aber in SBCL liest es zuerst und gibt dann aus. Ich habe ein wenig im Internet gelesen und es geändert:

(format t "asdf")
(force-output t)
(setq var (read))

Auch dies funktioniert einwandfrei in CLISP, aber in SBCL liest es immer noch zuerst und gibt dann aus. Ich habe sogar versucht, es in eine andere Funktion zu trennen:

(defun output (string)
   (format t string)
   (force-output t))
(output "asdf")
(setq var (read))

Und es liest immer noch zuerst und gibt dann aus. Verwende ich force-output nicht richtig oder ist das nur eine Eigenart von SBCL?

29voto

Rainer Joswig Punkte 131198

Sie müssen FINISH-OUTPUT verwenden.

In Systemen mit gepufferten Ausgabeströmen bleibt ein Teil der Ausgabe im Ausgabepuffer, bis der Ausgabepuffer voll ist (dann wird er automatisch zum Ziel geschrieben) oder der Ausgabepuffer explizit geleert wird.

Common Lisp bietet drei Funktionen dafür:

  • FINISH-OUTPUT versucht sicherzustellen, dass die gesamte Ausgabe erfolgt und kehrt DANN zurück.

  • FORCE-OUTPUT startet die verbleibende Ausgabe, kehrt jedoch SOFORT zurück und wartet NICHT darauf, dass die gesamte Ausgabe erfolgt.

  • CLEAR-OUTPUT versucht, alle ausstehenden Ausgaben zu löschen.

Auch das T in FORCE-OUTPUT und FORMAT sind leider nicht dasselbe.

  • force-output / finish-output: T ist *terminal-io* und NIL ist *standard-output*

  • FORMAT: T ist *standard-output*

Dies sollte funktionieren:

(format t "asdf")
(finish-output nil) ; beachten Sie das NIL
(setq var (read))

0 Stimmen

Eine weitere Option, wie in Practical Common Lisp beschrieben, ist die Verwendung des globalen *query-io* anstelle von t oder nil.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X