星にゃーんのブログ

ほとんど無害。

SBCLで(progn (princ hoge) (read))の実行順序が入れ替わるときの対処法

問題のコードがこれ

(defun read-with-prompt ()
  (princ "> ")
  (read))

CLISPではきちんと動く。

[1]> (read-with-prompt)
> hoge
hoge

SBCLではこうなる。

* (read-with-prompt)
hoge
> 
hoge

princよりも先にreadが実行されてしまう。 この問題は、SBCLの最適化が原因らしい。 (finish-output)で出力の終了を明記するとうまく動く。

修正後のコード

(defun read-with-prompt ()
  (princ "> ")
  (finish-output)
  (read))

下記のコードを書いている時にこの問題を発見した。

じゃんけん