[SML 7607] Re: 第9回Smalltalk勉強会@京都

AOKI Atsushi atsushi @ cc.kyoto-su.ac.jp
2009年 7月 5日 (日) 19:00:04 JST


Takafumi Saikawa さんは書きました:
> a := b := c := aValue.
> というような代入が連なる文を初めて見たのですが、意味としては
> c := aValue.
> b := c.
> a := b.
> と同じなのですよね?
> 
> (特に2項の)メッセージ式についての一貫した左結合性を思い出すと、
> aValue =: c =: b =: a.
> と書きたくなります。

さすが才川さん。鋭いご指摘です。ブラックブックにも書いておき
ました。96ページから97ページをご覧ください。構文木の図を省略
しますが、以下にブラックブックの本文を引用します。

------------------------------------------------------------

 代入した結果の値は、代入されたオブジェクトとなるので、次の
ように代入を重ねる書き方も可能です。

| firstObject secondObject thirdObject anArray |
firstObject := secondObject := thirdObject := nil.
anArray := Array
with: firstObject
with: secondObject
with: thirdObject.
anArray yourself
==> #(nil nil nil)

 このプログラムの構文ツリーを出してみると、一文の中に複数の
代入がある場合には、右から処理されていることがわかります(図3.21)。
中央の一番深い枝をご覧ください。

図3.21 代入を重ねた場合の処理順序を調べる

 thirdObject にnil が代入された結果がsecondObject に代入され、
secondObject に代入されたものが firstObject に代入されています。
左から順々に処理されるメッセージとは逆ですね。

------------------------------------------------------------
AOKI Atsushi          http://www.cc.kyoto-su.ac.jp/~atsushi/


SML メーリングリストの案内