ようやく「継続」がわかってきた


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を構成するには継続はなくてはならないものである以上、理解した方がよいものと思ってます。
理解できないってやっぱり悔しいですしね。

Comment