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]なので「同じ変数」ではないということ。