鋼鉄の息子Fortressっていうプログラミング言語を作ってる人は、CLtLの執筆者ではあるけれど、Schemeを作ったのはSussmanですね。プログラムの書き方PCからPCへあるサブディレクトリをまるごとコピーして、その中のプログラムを実行しようとしたらエラーになった。いうのは、一緒に入っているデータファイル(ここではWindowsのiniファイルとする)が実に40個ほどあるのだが、すべてに共通するパラメータに、ドライブレターの指定があって、それがもとのPC用にD:となっているからだ。すべてを新しいPCの環境に合わせてC:にしなければならない。エクスプローラを起動して、最初のiniファイルをダブルクリックしてメモ帳を開いた新人のN君に対して、先輩のOさんが「ちょっと待った」と声をかけた。しなければ動かないじゃないですか」とN君は不思議そうにOさんの顔を見る。40個といえば、大した数だ。エクスプローラを詳細表示モードにして更新時刻でソートすれば、直し忘れたファイルはすぐに見つかりますよ」とN君は得意そうに言う。●手軽な検証手段が確保されている「じゃあ、とりあえず、今開いたファイルだけ直してみなよ」とOさん。N君は、メモ帳の「編集」メニューをクリックして「置換」を選択して、「検索する文字列」に「D:」、「置換後の文字列」に「C:」を入力して「すべて置換」を実行した。「おいおい、『すべて置換』だと間違えて置換する心配はないのかい?」と言うOさんに、どうしてもケチをつけたいようだな、と気づいたN君はきっぱりと、「Oさんもごぞんじでしょう。この中で:が使われているのはドライブレターの指定だけですよ。「ということはだ」とOさんはにこにこしながらN君に言った。「君はエクスプローラの機能を使って、修正したかどうかを確認すると言ったね。コンピュータに作業を任せるということの意義を理解しているということだ。『すべて実行』を使って書き換えられるという条件もわかっている。保存して、次のファイルを開こうとするN君を制してOさんは続けた。「そりゃ、難しいプログラムは難しいさ。これからやろうとしていることは、そんなに難しいわけじゃない。僕らがやらなければならない作業手順をプログラムで置き換えていくだけのことだ。それに、プログラムにしておけば、次に似たような作業が必要になったとき――ご存じのように元のPCは潰してしまったけど、しばらくするとまた返されてくるからコピーバックしなきゃならない。「あ、つまり、元のiniファイルも保存しておかなきゃだめですね」と、N君は気づいて、originalという名前のフォルダをエクスプローラを操作して作り始めた。そのリアクションの素早さを嬉しそうに眺めながらOさんは続けた。「それはひとつの方法だよね。作業を逆に実行してもすむよね。「でも、それはめんどうですよ」と、N君は、元のフォルダーのiniファイルを全部選択して、originaloへ右クリック−ドラッグ−ドロップしてコンテキストメニューから「コピー」を選んだ。「だから、その作業をプログラムにしようということだ。「でした」といって、N君は更新日時でソートしてダブルクリックしてメモ帳でオープンして編集メニューから......「ああ、なるほど」と、N君。「なんとなく、Oさんの言ってることがわかりました」#こういう文章って、なんかめんどうだな。プログラムの書き方(2)「じゃあ、プログラムを書こう。エクスプローラからコマンドヒアで、このディレクトリにコンソールを開いて......ねぇ。インストールされてねぇ」とOさん。「なんですか、それ?」とN君。#ここで、Oさんがめんどうになって帰ってしまうという展開にすると楽だな。打ち込んでから、エクスプローラのアドレスバーの文字列をドラッグするとコマンドプロンプトへドロップした。何も起きないので、Oさんは呪詛をまきちらした。「シフト右クリックで、パスとしてコピーですよ」と助け舟を出すN君。drivechange.rbと打ち込んだ。そんなファイルは無いから作るかというメモ帳に、OKをクリックしておもむろに、説明を始めた。-Ks「Oさん、これ、Unixマシンじゃないですよ」と頭大丈夫か、と言わんばかりのN君。「そりゃそうだが、Rubyがシーバン行を参照して、rubyが起動される設定ならば、オプションを読むっていう仕様なんだから、しょうがないのだ。シフトJISを使うよ、という指定。この中には出てこないとは思うけどね。「ああ、よくプログラミング言語入門に出てくる、『おまじない』というばかな言い回しで示される決まりのことですね」と、N君は辛辣だ。「確かに、ばかな言い回しだとは思うが、こんなあたりまえのことを説明するのはくそめんどうだから、しょうがないってことが良くわかったよ」とOさん。「まあ、それはそれとして、手順を考えてみよう。人間がやる場合には、エクスプローラから拡張子がiniのファイルを順番にダブルクリックして処理していくことになるよね」と言いながらOさんは次のリストを打ち込んだ。drivechange.rb」と打ち込む。すると、コンソールに拡張子がiniのファイルが""付きで出力された。「結果はわかるけど、全然、意味はわかりません。Dirってなんですか、openってなんですか、かっこはなんですか?」とN君。「いちいち説明していると面倒だから、おまじないだ。Dirってなにかとか、openってなにかとか、薄々はわかってるんだろ」とOさん。nextもわかるかな。「それは宿題」とあっさり先へ進むOさん。endend「これで、tmpfileっていういい加減な名前の中間ファイルを書き込みモードで開いてから、iniファイルの1つから読み込んだ内容のd:をc:に書き換えたものを書きだしてるわけだ。drivechange.rb」と打ち込んだ。「tmpfileができてるはずだから、確認してくれ」N君は言われるままに、エクスプローラからできたてのtmpfileを......「ダブルクリックできないですよ。tmpfile.txtにしてくれりゃいいのに」とぶつぶつ言いながら、一覧からプログラムを選択でメモ帳を開いて中を見る。「うまくいくようだから、完成させてしまう。1ファイル処理するたびに、tmpfileを元のファイルに上書きしてけば良いわけだろ」と言いながらOさんはプログラムを修正する。drivechange.rb」と打ち込む。'tmpfile'「なんだ、知ってるじゃん」とOさん。changedrive.rb」と打ち込んだ。それからエクスプローラをF5して、tmpfileがなくなったことを確認して、「で、お勧めは?」。「とりあえず、File、FileUtils、Dir、String、正規表現、あとは制御構造と演算子を覚えりゃいいんじゃないかなぁ。オンラインリファレンスがあるはずだから、適当に検索して探したら」と言いながら立ち去ろうとするOさん。実は、考えていたよりも時間がかかったので、N君に人間プログラムをさせればよかったかな、と少し後悔してたりして。「で、まとめると」とN君。「機械的な作業だな、と気づいたら、作業手順を考えて、それを外側から順番にプログラムとして記述していく、ということですね。「で、とりあえず、このプログラムで使ってるものを調べる。09:04)fileutilsではなくpathnameを最初から使うというほうがよいのでは、と思いましたがいかがでしょう。09:28)>N君の洞察力<br>願望が入ってますよね。<br>>pathname<br>fileutilsのとりあえずの楽さというか。N君はUNIXコマンドを知っているという前提(シーバン行へのツッコミ)があると、fileutilsを教えるとすごく楽そう。本当を言えば、僕があまりpathnameを使わないからなんですが。10:07)とか言わずにpathname使うように変えてみますね。