Category Archives: Dev

「つくって学ぶプログラミング言語 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

Windowsでconやprnという名前のファイルを作成する方法

Windowsでprnという名称のファイル作成

Windowsでprnという名称のファイル作成

「何個知ってた?聞いた時驚くけど実はどうでもいい事まとめ」に「Windowsでは『prn』というフォルダを作れない」という項目があった。Windowsでは一般的にprnとかconというファイルは作れないと言われている。Wikipediaの「予約デバイス」にもそのように書かれている。これはMS-DOS時代の予約デバイス名の仕様を受け継いでいるためで、そのころからの古参プログラマや、Windowsの開発者にはよく知られていることだ(ちなみに、conはコンソール、prnはプリンタを示すデバイスで、ちょっと印刷するのに type foo.txt > prn などとやることもあった)。

しかし、実はこれらのファイルを作ることは可能だ。方法は簡単で、コマンドラインでパスをUNCで指定するだけだ。こんな感じで。

copy NUL \\.\C:\User\username\Desktop\prn

この方法で、conもNULも作ることができる。どうやらWindows NT時代にPOSIX準拠にするために必要だったらしいですよ。

しかし、このファイル、作ったはいいけど、扱いが容易ではない。エクスプローラから削除しようとしてもこういうエラーが出る。ちょっと普段見ることがない内部エラーが見えて面白い。

prnを削除できない

やっかいなファイル名なのでよほどの理由が無い限り使わないのが正解だと思う。ちなみに削除もUNCパスで指定すれば可能だ。

del \\.\C:\User\username\Desktop\prn

どうでもいいことは楽しいですね。

こういう謎の仕様としては、かつてのMacOSで「レモン」と「メロン」というファイルを同じフォルダに作れなかった、という仕様も好きです。


Railsの環境オプション

新旧Railsレシピブック

新旧Railsレシピブック

些末なことだが、Rails 2.x では環境指定の方法が migrateタスク と runner と consoleコマンドで違っているのが不便だ。runnerはオプションの指定方法をセオリ通り2つ用意しているが、そのせいで余計に混乱する。特に使う機会が少ないrunnerとconsoleはいつも確認していた。こんな感じ。

rake db:migrate RAILS_ENV=production
ruby script/runner -e production 'Foo.do'
ruby script/runner --environment=production 'Bar.do'
ruby script/console production

Rails 3.xでは真っ先に改善されているかと思ったら、コマンドがrailsコマンドに集約された以外は何も変わっていなかった。これは何か理由があるのかもしれない。

rake db:migrate RAILS_ENV=production
rails runner -e production 
rails runner --environment=production
rails console production

私だったらこんな感じにするかな。rakeの環境指定は難しいところだが、rubyっぽく環境名をconfig.ymlを見て自由に指定できるようにしたい。できるのかな。consoleは直交性のために-eオプションを付けても受け付けるようにする。これだけでもうれしいけど、甘いかな。

rake db:migrate:production
rails runner -e production 
rails console [-e] production

Rails3レシピブック 190の技
高橋 征義 松田 明 諸橋 恭介
ソフトバンククリエイティブ
売り上げランキング: 75223