Concurrent Clean : Re: 遅延IO

[id:lethevert:20070423:p3]について、検証してみた。

module Main

import StdFile, StdDebug

Start w
    # (_,fout,w) = fopen "output.txt" FWriteText w
      (_,fin,w) = fopen "input.txt" FReadText w
      (cfin,fin) = lazyIO fin
      (data,fin) = toLines fin
      fout = write_lines data fout
      (_,fout,w) = lazy_fclose fout cfin fin w
      (_,w) = fclose fout w
    = w

write_lines :: ![String] !*File -> *File
write_lines [] f = f
write_lines [l:ls] f
    # f = fwrites l (trace "output\n" f)
    = write_lines ls f

toLines :: !*File -> (![String], *File)
toLines f
    # (end,f) = fend f
    | end = ([],f)
    # (line,f) = freadline (trace "input\n" f)
      (lines,f) = toLines f
    = ([line:lines],f)

lazy_fclose :: !.a !*File *File !*World -> (!Bool, !.a, !*World)
lazy_fclose a cf _ w
    # (ok,w) = fclose cf w
    = (ok,a,w)

lazyIO :: !*File -> *(!*File,!*File)
lazyIO v
    = code {
        push_b 2
        push_b 2
    }

というプログラムで、

1
2
3
4
5

という入力ファイルをあたえると、標準出力に

$ ./a.out 
output
input
output
input
output
input
output
input
output
input
65536
Execution: 0.00  Garbage collection: 0.00  Total: 0.00

と出力された。
予想通り。