Perlでiostream
C++のiostreamに憧れたことがある。
#include <iostream> #include <iomanip> int main(...){ std::cout << "int: " << 42 << std::endl; std::cout << "str(left) : [" << std::setw(10) << std::left << "hoge" << "]" << std::endl; std::cout << "str(right): [" << std::setw(10) << std::right << "hoge" << "]" << std::endl; return 0; }
実行結果:
int: 42 str(left) : [hoge ] str(right): [ hoge]
これは演算子オーバーロードを利用して実現している。静的に型付けられる言語で,型安全に任意のオブジェクトを出力できるこの考えはすばらしい!と思ったものだ。ただ,printf()相当のことをするだけなのにコードが長くなりがちなのは大きな欠点である。
ただそれでもやはり利点はある。出力先を明示的に書く非常に分かりやすい。また,オブジェクト指向の出力操作なので拡張が容易だし,ダックタイピングに基づくコーディングさえできる。
以下のコードはOutputStreamクラスのインスタンスostrmに文字列と整数を出力する。 OutputStreamは"<<"演算子を定義しているクラスなら何でもいいが,適切な型を受け付ける必要がある。たとえば,intは"<<"演算子を持つが,右辺値として文字列を受け取ることは出来ないのでf()に渡すとコンパイルエラーとなる。
// f(std::cout) -> OK // f(0xFF) -> Compile Error template <class OutputStream> void f(OutputStream& ostrm){ ostrm << "int: " << 42 << std::endl; }
Perl VMを拡張すればこのストリーム演算子を定義することができる。…と思ったが,よく考えたらoverloadでも十分だ。というわけでこれは完全にボツネタ行き。
もっとも,静的型によるオーバーロードのないPerlではほとんどメリットはなく,仮に実装したとしてもAcme::行きだろう。