読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

継続むずかしい…

関数を実行するたびに値を増やすカウンタを作ろうと思って、継続つかえないかなと思ったけど、むずい。
下の場合だと、一度(counter)した時、(define counter (make-counter))までのぼるので、counter自体が再定義されちゃう(defineで再定義してるから実行結果は未定義?)。

継続に対する今のイメージは、(cc v)する度に、(call/cc (lambda (cc) ...)の部分がvに置き変えられて、これ以上実行するものがなくなるまで外側の括弧にのぼってくような感じ。

#!/usr/bin/env ypsilon

(define (print . args)
 (apply display args)
 (newline))

(define (make-counter)
 (define i -1)
 (call/cc
  (lambda (return)
   (call/cc
    (lambda (cc)
     (return cc)))
   (set! i (+ i 1))
   (return i))))

(define counter (make-counter))

(print (counter))
(print counter)

; vim: set ts=1 sw=1 sts=1 et