小飼弾です。ご機嫌はいかがでしょうか。

 今回はプログラマーの三大美徳の二番目、「短気」を取り上げます。

  1. 怠慢(Laziness)
  2. 短気(Impatience)
  3. 傲慢(Hubris)

 前回の続きに入る前に、まずはLarry Wallによる定義の紹介から入ります。彼はImpatienceをこう定義しています

IMPATIENCE
The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least that pretend to. Hence, the second great virtue of a programmer.

訳すとこんな感じしょうか。

短気
コンピューターが怠慢な時に感じる怒り。この怒りの持ち主は、今ある問題に対応するプログラムにとどまらず、今後起こりうる問題を想定したプログラムを書く。少なくともそうしようとする。よって、プログラマーの第二の美徳である。

前回、私は「怠慢だけでは」だけで充分ではない、短気も必要であると書きました。ここで前回の問題を思い出してみましょう。あなたは怠慢を発揮して、ひな形を使って日付を入れるプログラムを書きました。しかし、自分だけではなく、部署の他の人々がそのまま使う場合部署に所属する人の数だけひな形を用意しなければなりません。どうしたらよいでしょう。

とりあえず考えられることは、名前もひな型で展開できるようにすればいいということです。実際にやってみましょう。まずひな形はこんな感じでしょうか。

%date% 社長、おはようございます。%name%です。

プログラムは、こんな感じ。

function fill_form2_0(e){ var yyyy = document.getElementById('yyyy1').value; var mm = document.getElementById('mm1').value; var dd = document.getElementById('dd1').value; var date = yyyy + '年' + mm + '月' + dd + '日'; var name = document.getElementById('name1').value; e.innerHTML = e.innerHTML.replace(/%date%/g, date).replace(/%name%/g, name); }

前回と同じく、フォームを埋めてから文書をクリックしてみましょう。

名前: 日付:

%date% 社長、おはようございます。%name%です。

とりあえず、上手く行ったようです。しかしすぐにこのプログラムの噂は部外にも広がり、今度は上司の上司が、客先でも使える文章にしようと言ってきました。すると今度は「社長」もひな形で展開するようにしなければいけません。挨拶も「おはようございます」のままでいいのでしょうか?

そして、プログラムをもう一度見てみます。私はJavaScriptの解説はしていませんが、それでも実際にひな形を展開するのが

e.innerHTML = e.innerHTML.replace(/%date%/g, date).replace(/%name%/g, name);

の行にあることはJavaScriptを知らない方にもなんとなくおわかりいただけるかと思います。そして、実際に書き換えを行っているのがreplace()にあることも察しがつくでしょう。ということは、置き換えるべき変数が増えたら、ここもどんどん増えてしまうのでしょうか?

ここで、「短気」の定義をもう一度思い起こしてみましょう。「今ある問題に対応するプログラムにとどまらず、今後起こりうる問題を想定したプログラムを書く」。そう、なぜ短気が必要なのか。もし「気長」なら、プログラムの仕様変更要求に気長に応じたはずです。

しかし、もしあなたが短気だったら、はじめからプログラムの仕様変更の必要がないようにプログラムしていたのではないでしょうか。

今度は、そのようにプログラムしてみました。

名前: 日付:
宛名: 挨拶:
ひな形:

%yyyy%年%mm%月%dd%日 %customer%様、%greetings%。%name%です。

こんどは、ひな形そのものまでカスタマイズできてしまいます。

しかし、驚くべきはプログラム本体の方です。

function fill_form(e){ var t = document.getElementById('template').value; e.innerHTML = t.replace(/%([a-z][a-z0-9]+)%/g, function(m0,m1){ return document.getElementById(m1).value || m1; }); }

なんと、前よりも多機能なのに、短くなってしまったのです。

その秘密は、なんといっても短気にあります。ひな形の「本質」が、「%variable%となっているところをvariableの中身と入れ替える」ということを最初から見抜いていれば、「%%で囲まれた英数字があったら、それを変数と見なしてその値と書き換える」というプログラムはすぐに書けるのです。

前回と今回はJavaScriptを使いましたが、実はJavaScriptはこの面で充分短気ではないのです。この変数を展開(interpolate)するという状況は、プログラミングにおいて頻繁に発生するのですが、JavaScriptではわざわざ変数を展開する機能を上記のとおり書かねばなりませんでした。

これがラクダ本のLarry Wallが作ったプログラミング言語Perlなら、なんとプログラミング言語本体にひな形を展開する機能がついています。たとえば同様のプログラムは、

print <<EOT; $yyyy年$mm月$dd日 $customer様、$greetings。$nameです。 EOT

でおしまい。もはやプログラミングとすら言えません。同様の機能はRubyにも存在しますし、PerlやRubyほど強力ではありませんが、C言語にすら存在*0します。

私はそこに、JavaScriptに欠けている側面、すなわち三大美徳の三つ目である「傲慢」の不足を感じます。次回はその傲慢について語ることにしましょう。