作者: Tsutomu Hiroshima
日時: 2003/3/18(17:14)
廣島です.

> 
> >  まぁ、アクティブな皆さんには説明不要と思いますが、リスナーの方々にはち
> > と説明しておきますと、ファーストクラスプロシージャってのは、よーするに関
> > 数(その類)が、まるで変数かなにかのオブジェクトのよーに扱える、という仕
> > 組みです。
> 
>   うーん、分かりません。いや、なんとなく分かりますが。
>   ちょっと調べても見つからなかったので何かポインタを示してもらえると助かります。

Perl でも出来ます.
こんな感じかな.

### 無名関数を生成し,関数へのリファレンスを返す.
sub func {
  my $name = shift;
  return sub { print "$name さん今日は!\n"; }
}

### 3 種類の関数生成
$a = func("Mike");
$b = func("Cathy");
$c = func("John");

### 生成した関数を呼び出す.
&$c; # John さん今日は!
&$b; # Cathy さん今日は!
&$a; # Mike さん今日は!

### 終り

面白いのは,func の ローカル変数 $name が,
返り値の無名関数から参照されているので,
func を抜けても生き続けていることです.
次の例なんかどうでしょう.

sub counter {
  my $i = shift;
  return sub { print "count ", $i ++, "\n"; }
}

$p = counter(1);
$q = counter(100);

&$p; # count 1
&$p; # count 2
&$p; # count 3
&$q; # count 100
&$q; # count 101
&$p; # count 4
&$p; # count 5
### 終り

各関数に結びつけられた $i は,
生成した関数からのみ,参照・変更が可能です.

Scheme の教科書ではこれを利用して,
データのカプセル化をして,
Scheme をオブジェクト指向気味に
拡張する問題が有ったりします.

-----------------------------
	廣島 勉
	(tsutomu@...)