Re: 関数プログラミングのアプローチ (3)

関数プログラミングのアプローチ (3) - lethevert is a programmer
http://d.hatena.ne.jp/lethevert/20071014/p2

咀嚼中…。

スコープが切り替わるんだ、ってところがピンと来にくいので関数呼び出しで置き換えてみた。

class RandState(object):
    def __init__(self, x, y, z, w, t):
        self.x, self.y, self.z, self.w, self.t = x, y, z, w, t

    @staticmethod
    def new ():
        return RandState(123456789, 362436069, 521288629, 88675123, 1)

def rand(r):
    t =(r.x ^ (r.x << 11)) & 0xffffffff
    x = r.y & 0xffffffff
    y = r.z & 0xffffffff
    z = r.w & 0xffffffff
    w = (r.w ^ (r.w >> 19)) ^ (t ^ (t >> 8)) & 0xffffffff
    return w, RandState(x, y, z, w, t)

r = RandState.new()
i, r = rand(r)
print i #=> 3701687786
i, r = rand(r)
print i #=> 458299110

def print_first_and_return_second(args):
    print args[0]
    return args[1]

print_first_and_return_second(
    rand(
        print_first_and_return_second(
            rand(
                RandState.new())))) # 同じ出力

同じrという名前の変数に入れているように見えても、それは1つめのrは2つめのprint_first_and_return_secondのargs[0]、2つめのrは1つめのpri...ndのargs[0]なので「同じ変数」ではないということ。