カッコ撲滅大作戦
パイプ機能について - Smalltalkのtは小文字です さん経由、ときどきの雑記帖 リターンズ - Pipeにするかしないかそれが問題だ? さん。
あるメッセージを送って得た結果を次のメッセージの受け手へと送るために言語の構成要素として“パイプ”を持っていないのだろうかという質問に始まりました。パイプを導入することによりカッコを少なくすることができるので、
((1 to: 100) select: [ :each | each odd ] ) sum.becomes
これは次のように書き換えることができるようになります。1 to: 100 | select: [ :each | each odd ] | sum.http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0709a.html#D20070906-6
パイプ風表現は メッセージを送っているように見えない。なにかが レシーバーからセンダー方向に逆行しているような感触がなんとも気持ち悪いです。
で、ちょっと思いついてみました。ひまわり や なでしこ の「それ」ように、偽変数 it とかじゃダメでしょうか。
1 to: 10. it select: [ :each | each odd ]. it sum
...ダメですね。いきなり手続き言語に成り下がってしまったですよ。しかも it sum ってなんですか!? カッコ悪すぎ。この方法はダメです orz
じゃあ、やっぱり Self みたいな キーワードメッセージ を導入するとかかなぁ。
(1 to: 100 select: [ :each | each odd ] ) sum.
結構スマート。なるほど納得な解決策かな?「頭小文字だとメッセージ頭・大文字だとメッセージの途中って」ルールはカッコいいのだけど、でも私は見にくいと感じてしまって、カッコで囲ってくれたほうがいっそ..とか思ってしまうのですが、これは単になれていないというだけかしら。
Little Smalltalk のカスケードメッセージ も微妙に使えそうな感じです。
(1 to: 100; select: [ :each | each odd ]) sum.
通常の Smalltalk の場合、最初のメッセージ式のレシーバオブジェクトに次から次へとメッセージを送る書き方(この例のコードだと 1 に select: が送られちゃう)ですが、Little Smalltalk では、最初のメッセージ式の評価結果にメッセージを次から次へと送ります。パイプとは違い、パイプ的効果は最初の一回だけなのですが、カッコが多くてウザいという問題の対処としてはそれでもかなり有効かしら。
Little Smalltak のカスケードメッセージは Timothy Budd 先生曰く「より一般化した」結果らしいけれど、しかし、これも非常に気持ち悪いと感じます。この気持ち悪さは、たとえばインデントでコードの構造をあらわすと
"普通のSmalltalk" Pen new roundNib:3; color: Color red.
と普通の Smalltalk が 非常に素直なのに対して、
"Littel Smalltalk" Pen new; roundNib:3; color: Color red.
な構造になるからかしら、と思います。
気持ち悪かったり、ウザかったりと、我ながらうるさいことこの上ないと思います。いっそ Lisper みたいに「カッコ?そんなものどこにあるんだい?」と言えればと (^^;