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 初めて見ました。何か良さそう。収穫収穫。