kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

「Scheme手習い」という本

Scheme手習い」というちょっと風変わりなプログラミング本があります

Scheme手習い

Scheme手習い

 

どんな本?

Structure and Interpretation of Computer Programs(SICP)という本があります
かなりメジャーなのでご存じの方も多いでしょう
有用性だけでなく概念の難解さや練習問題のボリュームでも有名です
もともとかのMITの教科書として書かれた本ですが
MITの学生たちですら手にあまるため後にもっと簡単な教科書に変更されたといういわくつき
一方、その壁を乗り越えた人たちには非常に大きな影響を与えており
各所で絶賛されています
何十年も前の本ですがその内容は未だに古くなっていません
恐ろしい本です

プログラマーの競争力を表にした、こんな記事を見つけました

booksという項目で、SICPは最高ランクに位置づけられています
SICPと同ランクにLittle Schemerという本がありますが、これが「Scheme手習い」の原書です

そのボリュームのおかげで挫折してしまう人もいるSICPに対し
こちらはたかだか200ページ程度
読むだけならまる1日もかければ十分です
これでSICPレベルの本を読んだ!と言えるならなんとお得な*1

変な導入ですがSICPの著者の一人であるGerald J. Sussmanが序文を書いてますし
Daniel P. FriedmanもMatthias Felleisen自身も有名なコンピュータサイエンスの人で
信頼のおける本です

この本の目的

この本の目的は、読者に再帰的に考えることを教えることにある。

 

と書いてあるとおり、ただただリストと再帰をマスターするための本です
それだけです

しいて言えば関数型プログラミングの基礎とは言えるかもしれません
再帰がよくわからないせいで関数型言語がうまく使えない、という人がいたら読んでみるといいかも
ただ、普通の関数型プログラミングでは自分で再帰を書くことは少ないんじゃないかという気がします
この本にはmapもfilterもfoldも出てきません
再帰を教えるという観点からするとただの便利関数にすぎないのでしょうか

コンピュータサイエンス(の中のある分野)への入り口と考えてもいいでしょう
Programmer Competency Matrixでの位置づけもそのあたりによるものと思われます

この本ではSchemeというLisp方言を使います
0から説明してくれるのでSchemeの知識は不要です
リストを再帰でプログラミングするのに必要な、
Schemeの中でもコア中のコアとなる部分だけしかでてきませんので文法で困ることはないでしょう

この本について、Scheme入門によいと書かれているレビューがあります
というか訳者まえがきにもそう書いてあるんですが
Scheme入門と思って読まないほうがいいと思います

この本ではScheme再帰を教えるための手段にすぎず
printfのような入出力の関数すら出てきません
この本を完全にマスターしたとしてもそれだけでは実用的なSchemeプログラムは書けません
Schemeを使って実用的なプログラムを書きたければ別の本を読むなりWebの記事を探すなり
する必要があります

本の中身

書き方は非常に特徴的で、全編問いと答えだけで構成されています

言葉によるきちんとした定義は出てきません*2
たとえば、本文が始まるといきなりこうです

これはアトムですか。
atom


はい。
atomはaで始まる文字列ですから。

 

問と答えがいくつか並んで、ああこういうのがアトムなんだな、というのがわかるしくみです
体で覚えろ系とも言います

定義が書いてないどころか、この章では何を学びます、といったことも書いてありません
何が書いてあるのかは自分で考えないとわかりません
普通なら怒られるところですがたまにはそういうのも面白い

読んでいると「掟」と「戒律」が出てきます
これが身に付けば再帰マスターってことになるのでしょう
「戒律」っぽくしようとしたのか古めかしく訳してありますが
歯切れが悪くてちょっと失敗な感じがしないでもないです
原文のせいかもしれませんが原文は別に古めかしい文体ではないように見えます

前半はひたすら再帰の練習
いくつかのパターンをしつこいほど繰り返しているのみです
まんなかあたりまで進んでこんなものかと思っていると
後半はコンピュータサイエンスや数学っぽいネタなど
再帰をつかったいろいろな話題が出てきます
いつのまにか最後はschemeの(すんごいサブセットの)実装まで話が進みます
不思議なペースです

勉強するなら

系統的に読むこと。
ある章が完全には理解できなければ、次の章はもっと理解できなくなる。 

 

特に前半はしっかりマスターしてから進むようにしましょう

この本を2回以下で読み切ろうとしないこと。

 

読み終わればわかりますが2回読まなければいけない理由があります
よーく考えてみても「正しそうなんだけどどこにもちゃんと書いてない」と思ったらスルー推奨

動かしながらやるのがいいでしょう
もし何も好みがなければRacketという統合環境を使うのが簡単です

もちろんお気に入りのエディタと処理系でも構いません
使ったことはありませんが Gauche とかよさげです
処理系による差異が問題になることはないのではないかと

RacketのデフォルトではRacketという拡張されたschemeを使用することになっています
たぶんそのままでも大丈夫ですが
うまくいかなければR5RS(Schemeの仕様)を選んで使えば間違いありません

この本は処理系だけでなく紙と鉛筆を用意して読んだ方がいいかもしれません

まとめ

プログラミングのノウハウというよりももう少し深いところを
学んでみたいというひとにはとてもおすすめです

読み終わったら続編に「Scheme修行」という本があります
こちらは再帰でなく、代入と継続について学びます
こちらもおすすめ

*1:上位ランクの人は下位ランクの本をすべてマスターしているのが前提というのがミソ

*2:言葉による、というのがこれまたミソ