[Squeak-ja: 2271] Re: ifTrue 等のカスケードについて
Masato Sumi
sumi @ seagreen.ocn.ne.jp
2005年 1月 17日 (月) 18:50:49 JST
田川さん、ごきげんよう。鷲見です。
true perform: #ifTrue: with: []; yourself
とすればいけます。
on 01/17/05 18:11, tagawa @ akademia.co.jp wrote:
> そこには深い理由が隠されていたりするのでしょうか?
まずカスケード「;」は、レシーバを dup してそれを pop することで
内部的には実現されています。
[3 + 4; * 5] method symbolic
=> ...
30 <22> pushConstant: 3
31 <88> dup
32 <23> pushConstant: 4
33 <B0> send: +
34 <87> pop
35 <24> pushConstant: 5
36 <B8> send: *
...
他方で、#ifTrue: はソース上ではメッセージ送信を装っていますが、
バイトコードレベルでは、効率を優先していわゆる goto 文で表現されます。
[true ifTrue: [#hi]] method symbolic
=> ...
22 <71> pushConstant: true
23 <99> jumpFalse: 26
24 <22> pushConstant: #hi
25 <90> jumpTo: 27
26 <73> pushConstant: nil
...
ここからは想像ですが、ここに pop/dup を整合性よく入れるロジックを組むのが
面倒だったのでコンパイル時に拒絶する仕様にしたのではないでしょうか。
--
Masato Sumi
Squeak-ja メーリングリストの案内