ラベル SCHEME の投稿を表示しています。 すべての投稿を表示
ラベル SCHEME の投稿を表示しています。 すべての投稿を表示

2023-06-13

Schemeの「継続」という概念

近所の図書館で『プログラミング言語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 はどのように実現されているのか」のようなものかとも感じました。

2023-06-12

MIT SCHEMEを学ぶ

有名な教科書である『計算機プログラムの構造と解釈』を学ぶ下準備としてSCHEMEを調べています。SCHEMEは仕様がコンパクトにまとまっていると言われていて、確かにそういう感じです。ただし、多くの実装が存在するので、どれを選んだら良いのか混乱します。また現実問題として、コンパクトな仕様の範囲では済まないことが多いようで、「Scheme requests for implementation」というものがあるようです。

 

ひとまずMIT SCHEMEを使ってみることにしました。SCHEMEはLISPの一種なので、入門書の最初はS式の話題から始まることが多いです。次第にSCHEME独特の機能の説明がなされますが、仕様がコンパクトなので、一通り全体像をつかむのは、それほど難しくはないんじゃないかと思います。

 

基本を学んだら、何か応用的なプログラムを組んでみたいところですが、そうなると基本機能だけでは済まなくなってきます。MIT SCHEMEの公式サイトでは「MIT/GNU Scheme Reference」が置いてあるので、これに目を通しておくほうがよいのではないかという気がしてきました。使用可能なSRFIについても書いてありますが、かなり膨大です。それを使わなくても、自分で実装することは可能かもしれませんが、既に存在するものを独自に作るのは「車輪の再発明」とも言われており、あまり推奨されません。またSCHEMEらしさを知るには、さきほどのドキュメントにあるものを使っていくほうが良いと思います。 

 

PDF版では500頁弱もあるドキュメントなので、簡単に読める量ではありませんが、どんなものがあるのか、ざっと目を通しておこうと思っています。