名もなき関数
C言語では名前がない関数はない。
VBでも、C++でも、Javaでも、関数には必ず名前がある。
これらの言語は企業や学校で非常によく使われている。
これら以外の言語を使ったことがないプログラマは多い。
名前がない関数が存在する言語がある。
名前がない関数のことを無名関数と呼ぶ。
無名関数がある言語を使ったことがない人には、
名前がない関数という存在が何故ありがたいのかを
理解することは難しい。
だから是非一度無名関数というものに触れてもらいたい。
無名関数がどういうものかを知った後で、
そんなものいらないという結論に至ったなら
是非その意見を聞かせて欲しい。
私はメジャーな言語に無名関数がないことをとても残念に思っている。
何故言語仕様に盛り込まないのか理由がわからない。
手続型にしろオブジェクト指向にしろ
関数が処理の基本単位であることに変わりはない。
ひとつの完結した処理を関数として切り分けることは良いとされている。
1つの関数は1画面内に収まるくらいにすることが奨められたりする。
しかし関数を作るには名前を付けなくてはならない。
この部分はまとまっている処理として切り分けたいのだけど、
適切な名前が思い浮かばない。
いちいち名前を付けるのが面倒臭い。
この場所でしか行われない処理なのに、
関数として別の場所に移すというのは可読性が下る。
これらの悩みを解決してくれるのが無名関数である。
無名関数は別の言い方をすると関数のリテラル表記である。
整数や文字列に変数という名前を付けなくても、
プログラム中に直接表現できるのと同様に、
関数も処理自体を直接表現できるということである。
仮にC言語で無名関数が使えたとすると、
どういう表現が可能となるか。
例えば3つの値のうち最大値を求めて画面に表示したい場合、
最大値を求める処理に名前を付ける。
int max3(int a, int b, int c) {
int max = a;
if (b > max) max = b;
if (c > max) max = c;
return max;
}
...
int main() {
...
printf("max = %d", max3(x, y, z));
}
関数に分けたはいいが、max3なんてもう2度と使わないと思う。
4つの値の最大値を求める処理が必要になったらまた関数を作るのだろうか。
max3は大したことやってないのに、
使っている場所と定義している場所が離れているのでソースを読む手間が増える。
だったら関数など使わずに書けばいいじゃないか。
int main() {
...
int max = x;
if (y > max) max = y;
if (z > max) max = z;
printf("max = %d", max);
}
でもこれだと処理の境界が曖昧になってしまう。
最大値を求める処理はひとまとまりになっていて、
外部のコードと明確に分けられているとわかりやすい。
int main() {
...
printf("max = %d",
(int fun(int a,int b,int c){
int max = a;
if (b > max) max = b;
if (c > max) max = c;
return max;
})(x,y,z));
}
こんな感じだろうか。
ここではfunを無名関数を表すキーワードとしている。
funもなくして(int (int a, int b, int c))とする方が、
わかりにくいが、C言語的かもしれない。
無名関数では関数を定義する場所と関数を使用する場所が同じになる。
名前は機能を単純に表すために付けるものだ。
しかし機能を単純に表すのが困難である場合もあるし、
単純に表そうということ自体がわかりにくくしてしまう場合もあるのだ。
そういう時に機能そのものをその場所に記述することができれば、とても便利である。
無名関数は他にも便利な点や面白い点がたくさんある。
関数を引数にとる関数、高階関数がある言語では特にその威力を発揮する。
名前を付けるという作業は多くのエネルギーを要する。
本当に名前を付ける必要があるのか。
名前を付けるだけの価値があるのか。
名前を付けることによってわかりやすくなるのか。
よく考えて欲しい。
名前などいらないこともあるのだ。
苦労して付けた名前が邪魔なこともあるのだ。
本質を指していない名前のなんと無意味なことか。

ちょうど、竹内先生ネタでいいのがあったから、
うちのブログにエントリー作ってみたよー。
今後はトラックバックの設定をよろしく(苦笑)
ども。
トラックバックは誰も使わないだろうと思ってデフォルトのままにしてましたw
次からは受け付けるようにしときます。