Makoto Satoh
makot****@yahoo*****
2003年 2月 5日 (水) 10:33:41 JST
佐藤です。 継続とは何かについて質問させて下さい。 # いつも新しいプログラミング言語を勉強するときに、自分に必要な # 機能から覚えればいいという現実的な自分と、その言語で用意され # ている機能はなるたけ網羅して覚えておきたいという理想的な自分 # の間で格闘になります。これは理想的なほうの自分を満足させたい # という点で、継続を理解したいという欲求から来ています。 # 以下のように理解をしても、それをどういう局面で、どういう処理 # を望んで使うかについては後日ゆっくり考えます。。。 「継続」の説明について、 http://www.jah.ne.jp/~naoyuki/Writings/VScheme3.html を参考にしました。ここでは以下のような流れで継続を説明されてい ます。 1. call/ccは1引数を取るSchemeの組み込み関数である。したがって、 (call/cc (lambda (x) x)) という例が挙げられる。 2. call/ccは、引数として与えられた関数(ここではlambda式)を、 現在の継続を引数として呼び出す関数なので、上の例は、 ((lambda (x) x) 現在の継続) と同じであり、評価すると「現在の継続」が返る。 # この後に、「現在の継続とは、call/ccを実行した後に評価すべき式 # の情報のこと」という文があるのですが、これも良く分かりません。 # つまり、何が(どれが)その(call/ccを実行した後に評価すべき「式」 # なのか分からない、ということです。 3. 継続(2.で得られた「現在の継続」)は、それ自体が1引数を取る関数 であるので、上のlambda式で仮引数xに束縛された継続は、 (x #t) のように呼び出すことができる。 4. 「継続を関数として呼び出すと、現在の継続をうっちゃって(注略) その継続を再開する」「call/ccの呼び出しの次に行った(行うべき であった)式の評価を行う」 前者は、意味どおりと理解できます。後者は上の#コメントのように よく分かりません。 5. 最終的に、「継続を呼び出すときに与えた引数を、call/ccが返す (call/ccの戻り値になる)」。 上の例では、 (call/cc (lambda (x) (x #t)) => #t となる。 上の一連の話は、文脈の中でのcall/ccの使い方に触れていないので、 call/cc単体について理解してもあまり意味はないのかもしれませんが、 一応、call/ccの働きを理解したいのと、上の理解が間違っていたときに もっと分かりやすい、ある文脈でのcall/ccの使い方が示されるかも、 という勝手な期待をしております。 一応、Teach Yourself Scheme in Fixnum Daysは読んでみましたが、 継続の部分は難しく理解できませんでした。 The Scheme Programming Language 2nd Editionを今読んでいるところで す。 # 「なんでも継続」、楽しみにしています。 よろしくお願いいたします。 __________________________________________________ Do You Yahoo!? Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/