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::行きだろう。