camel

Matzさんからお返事が。

Matzにっき(2007-02-19)
Perl出身の弾さんゆえ、Perlに親しんでおられるのはわかるが、 近代的言語においてsigilを採用するのであれば、 その示すべきものは絶対にデータタイプではない。 データタイプを表現するsigilなんてのは ユーザ定義データタイプを持たない旧式言語の名残でしかない。

これ、実は半分同感。

Matzにっき(2007-02-19)
Perlでさえ、Perl5以降はリファレンスの導入により ほとんどすべてのものをスカラで表現できるようになったので、 旧来のデータタイプsigilの役割はずいぶん下がっている。

これがさらにPerl6になると、Rubyみたくすべての変数がオブジェクトなので、@array%hashも使わなくて済んだりする。

my @array = (0,1,2);
my %hash  = (one => 1, two => 2, three => 3);

は、

my $aref = [0, 1, 2];
my $href = { one => 1, two => 2, three => 3 };

で済むし、要素へのアクセスも、かつては

my $zeroth = $aref->[0];
my $one    = $href->{one};

としなければならなかったのが

my $zeroth = $aref.[0];
my $one    = $href.<one>;

で済むようになり、しかも.は略記できるので

my $zeroth = $aref[0];
my $one    = $href<one>;

と、生のarrayやhashのごとく使えるし、悪名高かった

foreach my $elem (@$aref){
  # ....
}

も、

for $aref -> $elem {
  # ....
}

と何の問題なく書ける。

それでは、$まで不要かというと、これが微妙なところ。これがあるおかげで、変数は必ず予約語と峻別できるので、言語の設計者は下位互換性を気にせずに予約語を追加できるし、関数/メソッドを追加したい時にも、変数との衝突を気にせず済む。これは小さからぬメリットだと思う。

Modula-2はこの問題を予約語を全て大文字にすることで解決したが、これはむちゃくちゃ不人気な解決法だった。どうもギークにはつぼがあるらしく、言語仕様的にはささいなこうしたことが、言語の人気不人気に決定的な役割を果たす事もある。Damian Conwayが「=を(例えば:=に)変えてはならない。私はそれで失敗した」とOSCONで話してウケを取っていたが、このあたりはある程度普及してみなければわからないし、普及した頃にはもう言語の方でそれを直すのは困難というジレンマがある。

もっともこれも、Haskellersなら「変数に代入可能になっているから問題がある。束縛しかないのなら関数と同じなのだからsigil不要」と言うかも知れない。しかしHasklell的な「簡単」は、Perlishにはほとんど受け入れられないのも確か。

少なくとも、sigilはこうした時の試練を生き残ってきた概念だし、今ではPerlの象徴ともなっている。実際golfersを除けば、sigilというのはそれほど不人気な概念でもない(@$arefは不人気だが、上述のとおりこれは改められる)。Perl 6でSigilを残したのは正解だと思う。

Dan the Man with Too Many Languages to Speak