12

このコードが実装ごとに異なる動作をする理由がわかりません。

(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の特異性ですか?

4

1 に答える 1

25

を使用する必要がありますFINISH-OUTPUT

バッファリングされた出力ストリームを備えたシステムでは、出力バッファがいっぱいになるまで(その後、宛先に自動的に書き込まれる)、または出力バッファが明示的に空になるまで、一部の出力は出力バッファに残ります。

CommonLispにはそのための3つの機能があります。

  • FINISH-OUTPUT、すべての出力が完了し、THENが返されることを確認しようとします。

  • FORCE-OUTPUT、残りの出力を開始しますが、すぐに戻り、すべての出力が完了するのを待ちません。

  • CLEAR-OUTPUT、保留中の出力を削除しようとします。

また、TFORCE-OUTPUTFORMAT残念ながら同じではありません。

  • force-output/ finish-outputTis *terminal-io*and NILis*standard-output*

  • FORMATTです*standard-output*

これは機能するはずです:

(format t "asdf")
(finish-output nil)   ;  note the NIL
(setq var (read))
于 2010-01-16T18:54:26.883 に答える