voidコンテキストの使われ方
まあ、PP のモジュールが void context であることを判定につかってるケースってほとんどないんですけどね。
ないですねぇ。自分もそんなの書かないし。
ちなみにClass-MOPではlib/Class/MOP/Method/Wrapped.pmでvoidコンテキスト関連の処理が書かれてますね。(前のエントリの最後に書いたのと同じ用途)
ラップ系はvoidコンテキストの面倒を見ないといけないですからね。
これまでの流れだと「そもそもvoidコンテキストって何に使うねん」って思ってる人もいそうなので例を挙げておきます。
voidコンテキストの実用例としては、例えばPod::Simple::RTF(Perl5.9.3以降ならコアモジュール)にあって、lib/Pod/Simple/RTF.pmのsub rtf_escで出現します。コメントも付いてて処理も平易なので、何やってるかは見れば分かると思います。
あんまり行儀が良いとは思えないですけど、その一方で、書き手の意図(文脈=コンテキスト)に応じてよしなにしてくれる感じがPerlらしいなあとも思ったりします。
また少し違う使い方の例でData::Dumpがあって、Data::Dump::dumpは
dump($foo); # STDERRにprintする $x = dump($foo); # printしないで値を$xに返す
という2種類の書き方ができるんですが、それを実現するためにvoidコンテキストによる振り分けが行われています。(lib/Data/Dump.pmのsub dump)
普通に考えるとこういうのはvoidコンテキストに頼らずに
print STDERR dump($foo); $x = dump($foo);
のように呼び出し側で明確に処理を書くようなインターフェイスにしますよね。もしくは生成用のメソッドと出力用のメソッドを別にして
# sub dumpがprintしないようにしておいて、 package Data::Dump; sub p { print STDERR dump(@_); }
とか。(だから自分ではvoidコンテキストを使った処理をあまり書いた事ないし、皆も書かないんだと思います)
まぁ「だいたいデバッグ用途で使うだろう」というData::Dumpの役割を考えると、「dump($foo)」って簡潔に書ける方が良いと思ったからなんでしょうね。
ここまで書いてて「コンテキストを拡張するモジュールあったんだけど何だったかなあ」って気になったので調べてみたら、Damian先生のContextual::Returnでした。ドキュメント読むだけでもワクワクします。ただレビュー見たら「こんなの使うのお勧めしないよ!」って書いてあった。自分もそう思います(笑)
ついでにレビューの中で見つけたこれ→http://www.perlfoundation.org/perl5/index.cgi?pbp_module_recommendation_commentary 初めて見ました。何か良さそう。収穫収穫。