「つくって学ぶプログラミング言語 RubyによるScheme処理系の実装」最速レビュー

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装
渡辺昌寛
達人出版会
発行日: 2013-04-15
対応フォーマット: PDF

私は修論のために並列Schemeを作ったことがある。名前はSucheme。ユーザ名のsuchiにかけたんですね(うへえ)。テーマ曲はHISの「あなたがスキー」とほぼ同じ「あなたがSucheme」だった(この曲の冬美さんはいいですよ、オススメ)。

R4RS準拠でAppendixのマクロまで1ヶ月くらいかけて実装してとても楽しかった。最終的にC言語とschemeのコードで1万行くらいの規模になったと思う。字句解析のコードは、状態遷移を当時「C MAGAZINE」のP.J.Plaugerさんの連載に載っていた「gotoを使ってエレガントにする方法だってある」というような主旨のswitch-caseとgotoで書く変な書き方で書いてみた。その後20年近くコードを書いているが、たぶんあれが私が最後に使ったgoto文だと思う。

しかしつづりがわからなかったので、P.J.プローガーで検索したら、ピーチ・ジョンがトップに出てきてシビれる。

で、時は流れ21世紀。githubアカウントを作ったときに、なにもパブリックリポジトリがないのもなんだし、と思ってruby版suchemeでも作るかと思い、sucheme on ruby だから suchemer という名前でパブリックリポジトリを作った。そして、とりあえずconsセルクラスだけ作ったのだがもう3年近く放置したままだ。そんな風にのんびりしていたら達人出版会から scheme in ruby が出てた。

読んでから書くか、書いてから読むか。悩むところだと3秒くらい考えて、結局買ってみました。しかし、そうか、on ruby じゃなくてin rubyなのか。

ざっと説明とコードだけ流し読みしてみた(夕食時に荒く読んだので間違ってたら訂正します)。ここで作るSchemeサブセットのμSchemeRは、データ構造はcons cellによるリストではなくて、配列で実装している。なので例えば carはa[0], cdrはa[1..-1]になる。束縛も同様。次はシンボルテーブルはベタにhashで書いて、たった2章で簡単なプログラムらしきものは作成できるようになる。

S式を読み込めるパーザはその後で作る流れになっている。しかもそのパーザはS式の文字列を、文字列変換でrubyの配列式にして、evalさせている。おお、たしかに最初はそれで十分。面白い!

そしてその後ようやくREPLを作っている。普通(ってなんですか)の逆で、これも面白いアプローチ! まずREPLのRのために字句解析書かないとなー、めんどうだなー、ということで3年放置するよりもよっぽどいい(構文解析はS式なんでかなり簡単)。

おそらくrubyの基本的な文法を知っていたら十分理解できる内容。プログラミング言語処理系を作ったことがあるというと、知らない人は驚くのだけど、lisp系言語は非常に簡単に作れるというのが理解できる。

気になるのはやはりリストを配列で表現していること。私がlispで面白かったのは、データ構造が(リストじゃなくて)実はconsセルのみだ、ということだ(註: モダンなlispにはvectorというデータ型もあります)。でも、この本はおそらく短さ(PDFで30ページ弱)も重要なポイントなので、どれを省くかと考えた場合十分ありえる選択だと思う。いっそのこと、これも後付けでデータ構造をconsセルで書き直させればいい勉強になりそうだ。

逆に、この本が面白いのは、最後の章で、このμSchemeR処理系をμSchemeR上で作ることを勧めていることだ。これ、SICPほど無双ではなくて、大学のちょっとした処理系講義によさそうな構成ですね。ここから先の5回はcall/ccやバッククォートとか好きに拡張させれば、ずいぶん楽しく勉強になる講義になりそう。CC-BYということで学生さんも気軽に読めます。

ということで、ほんとSchemeサブセットくらいでも書き方やアプローチがいろいろあるんだなあと大変面白く読みました。


この記事は「最速レビュー。村上春樹『色彩を持たない多崎つくると、彼の巡礼の年』に驚いた」にインスパイアされて作成されました。

インスパイア……

色彩を持たない多崎つくると、彼の巡礼の年
村上 春樹
文藝春秋 (2013-04-12)
売り上げランキング: 1
日本の人
日本の人

posted with amazlet at 13.04.16
HIS 細野晴臣 忌野清志郎 坂本冬美
EMIミュージック・ジャパン (2006-01-25)
売り上げランキング: 6,938

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">