継続初体験

むー,むつかしいですね.
でも,やっとこさ,本日,少しだけわかってきました.

(((call/cc (lambda (k) k)) (lambda (x) x)) "HEY")

こんなのが,例題にございました.これを理解するのは骨が折れると書いてたんですが,
それよりも,この前にあった,

(let ((x (call/cc (lambda (k) k))))
  (x (lambda (ignore) "hi")))

の方が,難解でした.


で,どう動作するのか,自分のために,まとめてみます.

(let ((x (call/cc (lambda (k) k)))) ;; --- (1)
  (x (lambda (ignore) "hi")))       ;; --- (2)
  • (1) で生成される継続は,x に,(call/cc) の値をバインドして,それをプロシージャとして,適用する.この適用の際の引数は,(lambda (ignore) "hi") というプロシージャ.
  • つまり,(1) で x に継続をバインドして,(2) で,その継続を,引数 (lambda (ignore) "hi") で呼び出す.
  • すると,継続から返される値は,引数で渡した値なので,プロシージャ (lambda (ignore) "hi") が返される.
  • で,(2) で,その返されたプロシージャを呼び出す.このときの引数は,(lambda (ignore) "hi").
  • つまり,((lambda (ignore) "hi") (lambda (ignore) "hi") ) となる.
  • その結果,"hi" が返ってくる,と.


続きまして,こちら.

(((call/cc (lambda (k) k)) (lambda (x) x)) "HEY")
  1. まず,(call/cc (lambda (k) k)) で継続が返される.どのような継続かというと,引数を (lambda (x) x) として,自身を適用して,さらに,"HEY" を引数として,返された値を適用する.
  2. 次に,この継続を呼び出す.引数は,(lambda (x) x).つまり,(継続 (lambda (x) x)) みたいな感じ.
  3. すると,まず,返される値は,(lambda (x) x) になる.
  4. でもって,お待ちいただいている方々の,一番手である,((lambda (x) x) (lambda (x) x) ) を評価する.
  5. 返ってくるのは,引数そのままなので,プロシージャ (lambda (x) x) が返ってくる.
  6. で,のこりの部分を評価する.つまり,((lambda (x) x) "HEY") を評価する.
  7. "HEY" が返される,と.

いまいちうまく表現できない,そして,用語の使いかたがわからん.適用とか,呼び出しとか.
あと,なんとなくあっている気もするが,間違っていたらつっこんでちょ.
継続を生成した時点でどのような継続かを知る方法ってないのかな?


さて,ヴァームものんだし,ビリっときますか.
てか,今日,風邪薬のんだら,タイミングが悪く,つまり,いつも飲んでいる薬と重なったせいか,
えらくふらふらして,歩くのもやばかった.これで,ホームとか歩いたら,マジ危険ですよ.