Gaucheの入出力の順番について
(display "please input: ") (let ((m (read))) (display "your input is ") (display m))
このようなコードがあった場合、以下のような順番の入出力になるように見えますし、実際に多くのScheme処理系ではこのような実行結果になります。
please input: hoge your input is hoge
ところがGaucheでは以下のような順番になります。最初の入力プロンプトが表示されず、入力後に入力プロンプトと結果のメッセージがまとめて出力されます。
hoge please input: your input is hoge
恥ずかしながら、この問題にずっと悩まされてきました。例えば、FLTVの発表でのGaucheによるデモでは、メッセージの表示の順番がおかしいままデモしたりしていました。
でも、これが不具合ならGaucheが実用的なプログラムで使われるわけはないし、単なる解釈の問題だという話を読んだ記憶もうっすらとあったり。そこで、Schemeコードバトンを機会にがんばってググってみました。
で、見つけたのがこれ↓
http://www.shido.info/gb/guestbook.php?id=1823
バッファリングの問題なんですね。これを防ぐには出力バッファの内容を強制出力するためにGaucheが用意しているflushを使えばOK。つまり、上のプログラムはこのように書き換えれば意図通りに動きます。
(display "please input: ") (flush) (let ((m (read))) (display "your input is ") (display m))
おそらくGaucheを使っている人には常識なんだろうなーと思いつつ、同じ問題で悩んでいる人向けに書いておきます。