[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 メーリングリストの案内