PostScriptでライフゲーム

よくあるプログラムだろうけど、せっかく作ったので載せます。
どうも手続き型言語風な書き方になってしまいます。

%!PS
%%BoundingBox: 0 0 190 190
gsave
/field
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]] def

/m field 0 get length def
/n field length def
/l 10 def

/nextfield n array def
0 1 n 1 sub {
    /j exch def
    nextfield j m array put
} for
/copyarray {
    /y exch def
    /x exch def
    0 1 x length 1 sub {
        /j exch def
        x j get y j get copy pop
    } for
} def
field nextfield copyarray

{
    0 1 n 1 sub {
        /j exch def
        0 1 m 1 sub {
            /i exch def
            i l mul j l mul l l
            field j get i get 1 eq {rectfill}{rectstroke} ifelse
        } for
    } for

    1 1 n 2 sub {
        /j exch def
        1 1 m 2 sub {
            /i exch def
            field j 1 sub get i 1 sub get
            field j 1 sub get i get       add
            field j 1 sub get i 1 add get add
            field j get i 1 sub get       add
            field j get i 1 add get       add
            field j 1 add get i 1 sub get add
            field j 1 add get i get       add
            field j 1 add get i 1 add get add
            /num exch def
            /nextij num 2 eq {
                field j get i get
            }{
                num 3 eq {1} {0}ifelse
            }ifelse def
            nextfield j get i nextij put
        }for
    } for
    nextfield field copyarray
    showpage
} loop
grestore