近所の図書館で『プログラミング言語SCHEME』を借り、これを読みながらSchemeを勉強しています。SCHEMEはLISPから派生した言語ですから、LISP独特のS式であるとか、ドット対のような、他のプログラミング言語には見られないような特徴があります。これらは独特ですが、理解するのが難しいというものではないと思います。
SCHEMEにおける難しい概念のひとつは、「継続」(「コンティニュエーション」と表現している場合もあるようです)だと思います。前述した書籍の「第3章 続Scheme」の「3.3.継続」では次のように説明されています。
call/ccには1引数のプロシージャpを渡す必要があります。するとまず、call/ccは現在の継続を獲得し、それをpに引き渡します。この時の継続自身は、kというプロシージャの形で表現されています。そしてkに値を引き渡して適用する毎に、その値がcall/ccを適用した際の継続に返されるのです。そしてこの値が、call/ccの適用における実質上の値となります。
また、kを起動せずにpが完了した場合、そのプロシージャが返す値がcall/ccの適用における値となります。
Schemeに慣れたら何でもないことなのでしょうが、まだ学び始めたばかりの段階の者にとっては、何を言っているか見当もつきません。「継続」でSchemeに躓くひとは少なくないようで、Webを調べていたら「Appendix 3. 継続についてもう少し」という記事を見つけました。これ以外にも「継続」について解説した記事がWeb上にはあるようですから、いろいろと読んでみたり、MIT Schemeで動作を確認してみたりして、概念を理解しようと思います。
前述した書籍には「以下は、再帰からの非局所的な脱出を行う、call/ccの使い方を示したサンプルです。」というような記述もありました。まだSchemeの「継続」が何なのか理解していませんが、C言語のライブラリにある「setjmpとlongjmp はどのように実現されているのか」のようなものかとも感じました。
0 件のコメント:
コメントを投稿