2010年5月19日水曜日

Gaucheインタプリタ上でのread-line

gaucheインタプリタ上では、read-lineは、困った動きをする。

> (read-line)
""
>
などと、read-lineを実行した直後のリターンコードを読み込んでしまう。
となると、
On Lispの、
Figure 4.7: I/O functions.
readlist
の実装が暗礁に乗り上げる。
> (read-line)a b c
"a b c"
>
などとして、出来たことにしても良いけど、どうにか回避することに挑戦する。
とりあえず、readは動作するので、最初だけreadで読み込んで文字列に変換すれば良い。
つまり、
(write-to-string (read) write)
これに、(read-line)の結果をつなげるんだけど、
単純に、
(string-append (write-to-string (read) write) (read-line))
は、Gaucheでは働くけど、Schemeは評価の順番が不定だから、他の処理系では、動かない可能性がある。
そこで、もう少し、工夫して、
(let ((str (write-to-string) (read) write)))
  (string-append str (read-line)))
これで、readlistは、準備OK

0 コメント: