vieweditattachhistoryswikistopchangessearchhelp

Smalltalk のブロック変数宣言の謎

必要なスペースは…

わたくし的には
[ :a :b :c | a + b + c ] value: 1 value: 2 value: 3 " => 6 "
(多くの Smalltalker あるいはケント・ベック的には [:a :b :c | a + b + c])と書くブロック(変数付き)ですが、このブロック変数宣言パートのスペースはどこまで省略できるのでしょうか。試してみたところ、最後の変数を除いたすべての宣言変数名直後のスペース以外は省けるようです。つまり、[:a :b :c|までスペース省略可で、[:a:b:c|までしちゃうと叱られます( [: Argument name expected ->a:b:c|a+b+c] というように)。「:」はセパレータとしては解釈されないようです。どこかで、ブロック変数宣言は「 : と | で囲み、: で区切る」と書いてあるのを見かけましたが、どうやらこの解釈はウソのようです。

逆にスペースを足す分には[ : a : b : c |というのも許容されるみたいです。問題なく「:」直後のスペースは無視して解釈されます。だからといって、Haskell のようにこのパートに式を記述したり、それに意味を持たせることはできません。あくまでブロック変数の宣言パートとしてのみ使用します。

そもそも「:」って何? なぜ必要なの?

謎です(笑)。おそらく Lisp のシンボルのリテラルに影響を受けたものと推察されますがどうしてこうした書き方にしたのかは分かりません。また、このパートはブロック変数の宣言のみに使われるので「:」なしでもいいような気もしますが、まあ、最初に「:」があるとブロック変数の宣言が続くことがすぐに分かってスキャナ的には嬉しいかな…とういのは想像できます。おしえて、偉い人!
--sumim

おおしまです。

以前squeak-devにAlanからのメールが流れていた記憶がありますが、キーワードメッセージ送信のアナロジーで、ブロックとはキーワード名(:の前)が空のメソッドである、とも見えるようにしたかった、というような話があったと思います。-- Yoshiki

おおっ。それは完璧な解ですね。Lisp のシンボルは穿ちすぎでしたか。キーワードのないキーワードメッセージ(のメッセージパターン)というアナロジーなら振る舞いにも矛盾しません(そりゃそうだわな…(^_^;))。だからといって、 [: a : b : c | とか書くと、ケント・ベック派には嫌われるんでしょうねぇ…。でもそうと知ってしまうとこのように書きたいという抗いがたい衝動に駆られます(笑)。少なくとも最初の : の前のスペースはいらないことに合点がゆきます。以後、: の後にスペースが入っているコードを見ても「あのバカが…」と笑ってやってください。情報、ありがとうございます!--sumim

アラン・ケイの言及は見つかりませんでしたが、ダン・インガルスのは見つかりました。
--sumim

ああっ、ダンでしたか。日ごろ勝手にいろんなものをアランに帰着させるのはよろしくない、と言っておきながら、あっさりやってしまいました。僕が覚えていたのもこのメールです。 -- Yoshiki

そうでしたか。私も最近は、なんでも Lisp に帰着させる傾向にあるので(実際、Lisp のシンボルだと信じていましたし…)耳が痛いです(^_^;)。ともあれ、貴重な情報をありがとうございました。--sumim

このページを編集 (2902 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 3892 times.