高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

sort関数のような…

 そういえばPerlで、sortやmap関数のように、{ statement }*1でコードを埋め込むことって出来ないんでしょうかね?
いやもちろん、sub{ statement }で無名サブルーチンを渡すといった方法は知ってます。でも、subという三文字すら邪魔 と思うときがたまにあります。かといって勝手にsubを省くと、不正なコンストラクタだとか言われてエラーが出るし。
 それ以外にも、たとえばsort。コード内では$a, $bという二つの変数が使えます*2
これらはソートの際、比較する個々の値が格納されるのですが、このように関数内で使用するブロックでのみ、使用可能な変数って、宣言出来ないんでしょうか?
これができないと独自で無名サブルーチンを引数に要求するサブルーチンを作ったときは、結局どう短くしてもsub { $_[0]->{name}; } みたいな使い方しかできないので、ちょっと不満です。
組み込み関数の特権なんですかねえ…。わたしはどうも、そういう言語レベルの特権がある言語って、あんまりすきじゃない…。
 JAVAもそうです。たとえばJAVAのStringクラスは、java.lang.Stringのエイリアスです。じゃあ、他のクラスにもやろうと思えばエイリアスってつけられるのか?というとそんなことはない。Delphiみたいにそもそも組込型として存在してるのなら、さして違和感は感じないものの。
まあ、その辺はC#も同じなんですけどね、stringというのは一見基本型ですが、System.String型のエイリアス。""(ダブルクオーテーション)もString型のコンストラクタと見なせます。intだってSystem.Int32のエイリアスだし、その辺で言えばC#のほうが分(?)が悪い。


 話がちょっとずれましたが…。
とりあえず、そんな書き方は出来ないんでしょうか?<#methodname argname="argvalue">みたいにしてテンプレートからサブルーチンを呼びだし、$argnameという変数を使えるようにする…なんてのやってみたいんですけどね。やっぱり$_[0]->{argname}とするか、$args = shift; $args->{argname}; としてもらうかくらいしかないか。

*1:map { ++$i . $_ } @n;のように…

*2:sort {$a cmp $b} @n