Lisp/SBCLでprintとreadの実行順序が逆になる場合の対処

Top / Lisp / SBCLでprintとreadの実行順序が逆になる場合の対処

症状

SBCLで、printの後にreadが呼ばれるように書いても、printより先にreadが呼ばれることがある。バグか仕様かわからないけど。

具体的には以下のようなもの。

1
2
3
4
5
6
7
8
9
10
11
> (defun echo ()
    (print 'first)   ; まずprintしてから
    (setf x (read))  ; 入力後に
    (print x) )      ; 表示してほしい

> (echo)
            ; 'FIRST' がprintされる前にreadの待機状態になる
second      ; 'second' を入力
FIRST       ; 'FIRST' がprint
SECOND      ; 'SECOND' がprint(setfのeval結果)
SECOND      ; 'SECOND' がprint(printのeval結果)

対処

  • readの前のprintを、prin1とterpriに置き換える。
1
2
3
4
5
6
7
8
9
10
11
12
> (defun echo ()
    (prin1 'first)   ; まずprin1する
    (terpri)         ; 改行コードを出力
    (setf x (read))
    (print x) )

> (echo)
FIRST       ; 'FIRST' がprintされた
second      ; 'second' を入力

SECOND      ; eval結果 
SECOND

参考にしたサイト

ブログ側のエントリ


Last-modified: 2011-11-02 (水) 15:47:37 (2539d)