関数プログラミングのアプローチ (19)

行番号を付加する関数的プログラム (2)

前回は、一意型をPythonで実現する方法について検討しました。今回は、これを用いて、行番号を付加するプログラムを作成します。
まず、前回の内容で不足しているファイル読み込み関数を作成します。作り方は前回説明した通りです。

def freadline (f):
    _f = fromUnique(f)
    text = _f.readline()
    return text, Unique(_f)

プログラム本体は、次のようになります。

import sys

def main (w):
    ifname = sys.argv[1]
    ofname = sys.argv[2]

    ifile, w = fopen(ifname, 'r', w)
    ofile, w = fopen(ofname, 'w', w)

    cnt = 0
    while True:
        line, ifile = freadline(ifile)
        if not line: break
        cnt = cnt + 1
        ofile = fwrites(str(cnt) + ' ' + line, ofile)

    w = fclose(ofile, w)
    w = fclose(ifile, w)
    return w

if __name__ == "__main__":
    main(Unique(1))

先のモナドを使ったプログラムよりも、命令的なプログラムに近いスタイルですが、一意型を使うことで参照透明性が成立しているところに注意してください。