ようやく「継続」がわかってきた
Javaもろくにできない癖にLispにうつつをぬかしている今日この頃ですが、「プログラミングGauche」を読んでもピンとこなかった「継続」が、ようやくわかってきた気がします。
ようやく光が見えてきたのは「Schemeによる信号処理入門」と言う本のおかげなんですが、この本ではかなり単純化した形で継続を示してくれてます。
以下は本に載っていたの継続についての説明なんですが、継続を考えるには「自分自身を渡す手続き」を考えるとすっきりする気がします。
; この式の(+ 1 2)の継続を考える (even? (* 3 (+ 1 2))) ; (+ 1 2)を a と考えると継続が得られる (lambda (a) (even? (* 3 a))) ; この継続に(+ 1 2)を与えると元の式になる ((lambda (a) (even? (* 3 a))) (+ 1 2)) ->(even? (* 3 (+ 1 2))) ; call/ccを使うと (even? (* 3 (call/cc (lambda (x) (x (+ 1 2))))))いままで見てきた継続の説明は、再帰を絡めて説明していたために、個人的にはわかりにくくなっちゃってたんですが、本書では実用的ではないけど単純な例で示してくれてます。
こう考えると、まだまだ再帰がものにできてないんだなぁと痛感します。
プログラミングGaucheの著者の方も、継続はすぐには理解できなくても大丈夫と書いてくれています。
でも、Schemeを構成するには継続はなくてはならないものである以上、理解した方がよいものと思ってます。
理解できないってやっぱり悔しいですしね。