need_result 2

まじかんと雑記
http://magicant.txt-nifty.com/main/2007/06/re_need_result_.html

他の言語にはなさそうな機能だという点では興味深いが、実際にこれが役に立つかどうかは甚だ疑問。

役に立つ場面が多ければ、他の言語にも実装されるもんですからね。
他の言語に無い時点で役立ち度は低いのは確かだと思います。

シナリオ 1、副作用が無い関数なので、戻り値が使われないような使い方をされたらエラーにしたい場合。これをやるには、副作用がない全ての関数についていちいち assert need_result を記述しておく必要がある。これはかなり面倒だ。実際、多くのプログラマは assert need_result を記述することをサボる (あるいは単に忘れる) と思われる。

これは特に記述することを忘れても問題ないです。あくまで、関数の作成者が関数使用者に対してする親切ですので。
この副作用が無い関数であることを示す別案として、「pure」という予約語を用いて関数生成すると、関数呼び出し元が戻り値を必要しない呼び出しをエラーとし、また関数内で副作用がない関数以外は呼び出せない、というのも考えてます。erlangのような並列機構と絡めて色々と思案中です。

シナリオ 2、戻り値が要らないなら、返す値の計算はしない場合。現実的には、このような場合というのはかなり稀だと思われる。

稀でしょうね。あったとしても、コンパイラが最適化出来る範囲で消せば、それでいいのかもしれません。


もう一つのシナリオとして、戻り値が必要かどうかで処理を切り替える*1、というのも想定したのですが、これはあんまりやるとperlのコンテキストと同じような混乱*2が起こるかな、と思い、言いませんでした。


「ボツ構文」行きになりそうな気はしてます。

*1:戻り値が必要無い呼び出しのされ方をしたら破壊的に、戻り値が必要な呼び出しなら非破壊的に、とか

*2:私は混乱した