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
と出力された。
予想通り。