“1から10までの自然数の合計”を Squeak Smalltalk で


ときどきの雑記帖 i戦士篇 2009年10月(上旬) 経由で 「転職活動する暇があったらブログを書け」について:ベンチャー社長で技術者で:エンジニアライフ にある件の問題をを半ば空気を読まずに(*1)書くと。

(1 to: 10) sum


Smalltalk スキーとしては「1から10までの自然数の合計」と聞いたら、これから書くコードがそう読めるようどう工夫するか?とか、メッセージング脳としては「1から10までの自然数」と「の合計」を表現するのに、誰にどんなメッセージを送ればよいかを考える…とか、ループを使うとか使わんとかよりは関心事はもっぱらそれらなかんじでしょうか。


ちょっと空気を読んで題意に忠実であろうとすれば、Interval>>#sum がどうあるのがよいかを考えるだろうと思います。

Interval >> sum
    ^(start + self last) * self size / 2


このメソッドを新たに定義せずとも、メッセージ sum で実質ループ(#inject:into:)で書かれている組み込みの Collection>>#sum というメソッドがコールされることで、もちろん答えは出ますが、100億までともなるとつらいので、そういう意味でもこの Interval>>#sum はあったほうがよいように思います。

ただ、LISPSmalltalk、これらの影響下にある言語では 1から10まで足す、ですって? - 何となく Blog by Jitta の後半で注意深く扱われているような桁あふれの問題に限っては、ほとんど意識しなくてよさそうです。

*1:Smalltalk で書く時点ですでに空気は読めていないとか、い〜わ〜な〜い〜の。