goの続き(その5)-seive.go読解

前からの懸案だったseive.goのアルゴリズム?をようやく理解した。
参考になったのは
ueBLOG | Pythonで素数生成
Pythonの実装なので違うと言えば違うのだけど。
ここでは、itertools.ifilterを使って、篩にかけているので、
篩自体は1段しかない。
(ただ、ifilterを使うと、filterっぽい?動き
1週目(2で割り切れないものを出力)=>3
2周目(2,3で割り切れないものを出力)=>5
3周目(2,3,5で割り切れないものを出力)=>7
以下繰り返し...
をするというのが今市よく分かっていない
(2,3,5みたいなリストはifilter内部で勝手に保持している?!)


pythonのitertoolsモジュールは一般的ではないのか、その存在自体、ほとんど知らなかった。
ま、確かに公式ドキュメントには記載があるのだけど、手元の何冊かの書籍には
その存在すら触れられていなかった。(私が発見できないだけ?)
イテレータそのものは解説があるし、概ね理解はできている(?)のだけど。


一方、goの方はもっと単純で、
1周目-2で割り切れないものを出力するルーチンをgorutineで実行=>3を出力
2周目-(前段の出力を受け取って)3で割り切れないものを出力するルーチンを
goroutineで実行する
これらのフィルタはすべて数珠つなぎ(digichain)になっている。(ch=ch1)
という風になっている。
で、genarate関数からは続々と自然数が送られてくるので、これをさっきの
多段(数珠つなぎ)フィルターでさばいていく
2周目のルーチンが動き出した状態では、generate関数からは4が送られてくる。
これが1段目のフィルタで落とされて(4%2=0)次に5が送られてくる。
1段目、2段目を通過(5=2!=0)(5%3!=0)=>5が出力される
これを受けて、3段目のフィルタ(5で割り切れないものを通す)がまたもや
goroutineで動き出す
次は6だけど、6%2=0なので、落とされて次に7がすべての条件を満たして出力...
...
やっと分かった。
しかし、よく考えられているなぁ。
UNIXのパイプ処理を連想してくれればいいんだ、と一言書いておいてくれれば...
って私だけ??
ps
参考になったブログを読んでいて分かったのだけど、この発想の原点は関数型
プログラミングに帰結するらしい。(元の例題はSICPだし)
pythonのfilterも関数型プログラミングから来ているというし、やはり、lisp辺りは
避けて通れないのか。