Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Perl

8 views
Skip to first unread message

Shinji KONO

unread,
May 19, 2007, 4:14:20 PM5/19/07
to
河野真治 @ 琉球大学情報工学です。

プログラミング言語シリーズ。

最初に見たのは、USENETに投稿されたPerl 2.0だったと思います。
88年あたり。Lally W all の名前は、patch とか rn とかで既に
良く知られてました。さっそく、展開して使ってみて違和感あり
ませんでした。awk/shell script に慣れてたのと、awk/shell scri
pt に違和感があったので、Perlを作る動機も理解できたし。

発想的には、BASIC だと思う。世代的にもBASICになじんだ世代だ
し。Unix APIを、全て使えるBASICが欲しいってことだよね。

最初に作ったのは、domain の定義から、named の定義ファイルを
生成するプログラムだと思う。Emacs のoutline mode のファイル
から、LaTeXを生成するscript は、D論を書くに使ってました。元
は、awk で、a2p で変換したものが元です。

なんだが~ Perl 5.0 で、$a->{-count} = 3 みたいなのが導入さ
れて、連想配列ベースのオブジェクト指向プログラムが導入され
ます。これは、嫌いな人が多いんじゃなかろうか?僕は、実は、こ
ういうインスタンス変数の実装が連想配列として見えてしまうっ
てのは、嫌いじゃないです。bless で、連想配列と module を接
続して、実行時にオブジェクトを構成するってのは、面白い。

実装が見えるのが嫌いなら、$a->set_count(3); みたいな感じで、
accessor を作れば良い。どんなオブジェクト指向言語でも、メソ
ッド呼び出しはハッシュ探索になるので、実は同じだし。Perl は
連想配列の高速実行に命を賭けている言語なので、それに頼るの
は script 言語として正しいと思う。

このあたりが嫌いで、Python/Ruby に逃げる人は多いでしょう。

Perl reference は、あんまり複雑なアクセスは書かないが、
  $album{$album}->{tracklist}->
   {sprintf("%04d,%04d",$disk,$track)} = \%song;
ぐらいは、普通に書いちゃう。

あるいは、
  my(%arg) = @_;
みたいな形で、関数の引数を連想配列で受けるというのも良くやります。こうすると、
  CardPlay::CardPileUndo->new(
   -from=>$prevSplit,
   -to=>$self,
   -at=> - ($#{$cardpile->{'-contents'}}+1));
みたいな形で、引数にキーワードを付けて、順不同にすることが
出来ます。割と普通の技術です。=> の前は、quote されるので、
'' は必要ありません。-つけているのは、Pe rl/Tkに合わせたん
だと思う。Tcl がそういう仕様なんだよね。

これは、Perlがオリジナルではもちろんなくて、Common LISPとか
Adaとかも、そういう機能があります。SmallTalk/Squeak も、似
たように hoge from: a to: self at: 7 みたいに書けるけど、順
序を変えたいと思ったら、全ての組合せを記述する必要がありま
す。

C で、これをやりたいときは、
 struct arg { int hage, fuga; int aho; };

 void f(struct arg h) {
   printf("%d %d %d\n",h.hage,h.fuga,h.aho);
 }

 int main8() {
   f((struct arg){.fuga = 3,.aho=5});
   printf("%d\n",((struct arg){.aho=120, .hage=55}).aho);
 }
とかすることが可能。でも、そんなことをしているのは見たことがないです。
   f({.fuga = 3,.aho=5});
と、呼べると良いんだが、それは出来ない。

C++ では、型で判断して呼び出す関数を選択する Polymorphism
ってのがあります。これが、wxWidget などで、絶望的にものごと
を複雑にしてしまっていると思う。Polymorp hism では、デフォ
ルト値をうまく与えることが出来ないんだよね。Open/GLとかでも、
関数名に引数の型を記号化して含めるハンガリアン記法を導入し
ているのは、Polymorph ismによる弊害を避けるためだと思う。C+
+ では、Defaults Arguments があるのだが、呼出側で keyword
が使えないのは不便。

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科

ku...@gssm.otsuka.tsukuba.ac.jp

unread,
May 20, 2007, 10:49:57 AM5/20/07
to

久野です。河野さんがJava Generics大好きとは…

ko...@ie.u-ryukyu.ac.jpさん:


> 実装が見えるのが嫌いなら、$a->set_count(3); みたいな感じで、
> accessor を作れば良い。どんなオブジェクト指向言語でも、メソ
> ッド呼び出しはハッシュ探索になるので、実は同じだし。

C++もJavaも違いまっせ。 久野



0 new messages