昔居た会社にシンボリック社日本法人の元社員が数人居た。当然というか何と言うか彼らはLisperであり、それについて熱く語る人たちだった。そういった会社に居たにもかかわらず、結局Lispがどれほどすごい言語なのかさっぱりわからなかった。


Lispの真価を知ったのは、そのマクロ機能を解説した以下の本を読んでからだ。


On Lisp
クチコミを見る





どんな言語でも良いのだが、ある関数(hogeCalcとする)の結果を元に分岐をしたいとする。多分ほとんどのプログラマは次のように書くことだろう。


-----------------------------------------------------------

if (hogeCalc() == XXX) {

     処理

}

-----------------------------------------------------------

コード1


で、ここでhogeCalcで計算した結果を他の部分でも使わなければならないという事態が発生したとする。そうするともうこの構文は使用できない。if文の中を変更するのが嫌ならばhogeCalcをもう一度呼ぶしかない。スマートでないけど、忙しいとこんなことをしてしまう人も居ることだろう(僕だ)

------------------------------------------------------------

if (hogeCalc() == XXX) {

     処理

}

//後で追加した処理

result = hogeCalc() + 100

------------------------------------------------------------

コード1-2



追加処理が一つだけなんで問題ないが、さらに追加した場合はこうなる


------------------------------------------------------------

if (hogeCalc() == XXX) {

     処理

}

//後で追加した処理

result = hogeCalc() + 100

result2 = hogeClac() - 100


------------------------------------------------------------

コード1-3



こうなるとソースコードを見られた場合に結構恥ずかしい。気にしない人もいるが(当然僕だ)

hogeCalcが軽い処理の場合は3回呼び出そうが1回呼び出そうが関係なくソースコードが汚いだけで済むのだが、hogeCalcがデータベースに接続したりする場合は、処理の時間が秒単位で変わる。悪態をつきながらも、以下のように書き直さざるを得ない。


------------------------------------------------------------

hoge = hogeCalc()


if (hoge == XXX) {

     処理

}

//後で追加した処理

result = hoge + 100

result2 = hoge - 100


------------------------------------------------------------

コード1-4


これは現行の手続き型言語ではどうしようもない。それはIF文がそういったものだからだ。では、”IF文の条件で実行された値を保持する”というIF文を作ってしまえば良いではないか、これがLispの発想だ。


新たにaif(アナフォリックIF)という特殊なIF文を作成する。これはIFの条件部分で実行された結果が特定の変数に代入されるというものだ。この場合"it"と変数に結果が入る。



では、コード1に戻ろう

-----------------------------------------------------------

aif (hogeCalc() == XXX) {

     処理

}

-----------------------------------------------------------

コード1


そしてコード1-3は以下のようになる

------------------------------------------------------------

aif (hogeCalc() == XXX) {

     処理

}

//後で追加した処理

result = it + 100

result2 = it - 100


------------------------------------------------------------

コード1-3


説明しやすいようにC言語(Java C# でも同じ)のように書いているが、残念ながらこれら現在主流となっている言語ではこのようなことは出来ない。主にLisp等の関数型言語(Perlでも出来そうだけど、未確認)以外では実現困難だ。


別にif文だけでなく、特殊なループ文を自分で作成することが出来る。例えばLispにはCで言うところのfor文がないので、自前でfor文を用意することになる。つまり、言語自体はいかようにも拡張可能な言語ということだ。


これ読んでLispはじめる人が居たら良いなぁ。いないと思うけど。





-----------------------------------------------------------