Drkcore

22 12 2007 Gauche Tweet

継続をつかみかけ

なんとなく掴みかけてきた。

call/cc 入門

continuation は「continuation が呼ばれると、continuation が作られた call/cc の外に、引数を call/cc の返り値としてジャンプする」というのが正しい振る舞いです。

gosh> (+ 5 (call/cc (lambda (cont) (* 10 10))))
105
gosh> (+ 5 (call/cc (lambda (cont) (cont 10))))
15
gosh> (+ 5 (call/cc (lambda (cont) (cont (+ 1 2 3)))))
11

次にやる処理を包み込んでひっくり返すというイメージよりは、単純にセーブポイントと考えたほうがよいのかな。call/ccの返り値としてジャンプ

gosh> (define cont #f)
cont
gosh> (+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))
15
gosh> (cont 30)
35
gosh> (cont (+ 1 2 3))
11

さてcall/ccを通って何かが出て行くというイメージだと、二枚がけとかできそうな感じなのでやってみる。

gosh> (+ 10 (call/cc (lambda (d) (begin (set! cont2 d) 
(+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))))))
25

セーブポイントはcont2とcontの二箇所。cont2をよべば(+ 10 cont2の返り値),contを呼べば(+ 10 (+ 5 contの返り値)が評価されるはず。

gosh> (cont 3)
18
gosh> (cont2 3)
13

おーきた。call/ccからジャンプしてきた。なんつーかperlのデバッガで作業してるみたいな感覚だ。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021