私は修論のために並列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
EMIミュージック・ジャパン (2006-01-25)
売り上げランキング: 6,938
0 Comments.