Smalltalkにおける「すべてがメッセージ」の裏側と例外

「[オブジェクト指向プログラミングとは結局なんなのか](http://blog.kokuyouwind.com/archives/1189)」の Smalltalk 関連の用語の使い方についてちょっとだけコメントさせていただいたところで、実はもうひとつ些細な間違いを見つけてしまったのですが、ただそれを直すとなると文章の流れを一部変えないといけないので申し訳ないですし、嘘も方便、わかりやすければ多少の実情との不一致もいいのかな、とあえてスルーした Smalltalk の裏事情をこっそり()こちらに書きたいと思います。

</br>
その気になった記述は
>重要なのは、booleanに限らずともifTrue:ifFalse:セレクタによるメッセージに返答できれば分岐処理が行える

というところで、理想としてはそうなのですが実際の処理系ではそのようにはなっていません。たとえば直後の

>数値型に0か非0かで分岐するメソッドを生やせば数値に対してifTrue:ifFalse:セレクタによるメッセージを送れます

というのをSqueak Smalltalkでやってみると

![iftrueiffalsetruth01.png](https://qiita-image-store.s3.amazonaws.com/0/49275/e1f196bf-f23e-cd67-f093-0bd6f2558c8a.png)

というふうに、NonBooleanReceiver: proceed for truth. としかられてしまいます。

</br>
なぜこういうことが起こるかというと、0 ifTrue: [#nonZero] ifFalse: [#zero] がどのようにコンパイルされているかを見ればわかります。

<blockquote>[0 ifTrue: [#nonZero] ifFalse: [#zero]] method symbolic</blockquote>

このように書き加えて alt/cmd + p などで print it してみてください。コンパイル後のバイトコード列とそのメッセージ風ニーモニック表現が表示されます。

```
33 <8F 00 00 06> closureNumCopied: 0 numArgs: 0 bytes 37 to 42
37 	<75> pushConstant: 0
38 	<99> jumpFalse: 41
39 	<23> pushConstant: #nonZero
40 	<90> jumpTo: 42
41 	<22> pushConstant: #zero
42 	<7D> blockReturn
43 <D1> send: method
44 <D0> send: symbolic
45 <7C> returnTop
```

37バイト目から41バイト目が試したコードのコンパイル結果ですね。何か気がつきましたか？　そう。新たに定義された Integer>>#ifTrue:ifFalse: なんてメソッドはここからはぜんぜんコールなんてされていないのです。

参考まで 1 hoge: 2 fuga: 3 というメッセージ式なら、次のようにコンパイルされます。

```
[1 hoge: 2 fuga: 3] method symbolic
```
```
29 <8F 00 00 05> closureNumCopied: 0 numArgs: 0 bytes 33 to 37
33 	<76> pushConstant: 1
34 	<77> pushConstant: 2
35 	<23> pushConstant: 3
36 	<F2> send: hoge:fuga:
37 	<7D> blockReturn
38 <D1> send: method
39 <D0> send: symbolic
40 <7C> returnTop
```

</br>
念のため、Integer>>#ifTrue:ifFalse: に、self halt. を挿入して accept (alt/cmd + s) し、コールされたらデバッガが立ち上がるようにしておいて、0 ifTrue: [#nonZero] ifFalse: [#zero] を改めて do it (alt/cmd + d) してみます。

<blockquote>Integer >> <b>ifTrue:</b><font color="#000000"> </font><font color="#00007F">nonZeroBlock</font><font color="#000000"> </font><b>ifFalse:</b><font color="#000000"> </font><font color="#00007F">zeroBlock</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">self</font><font color="#000000"> </font><font color="#00007F">halt</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">^</font><font color="#7F0000">self</font><font color="#000000"> </font><font color="#00007F">=</font><font color="#000000"> </font><font color="#7F0000">0</font><font color="#000000"> </font><font color="#00007F">ifTrue:</font><font color="#000000"> </font><font color="#000000">[</font><font color="#00007F">zeroBlock</font><font color="#000000"> </font><font color="#00007F">value</font><font color="#000000">]</font><font color="#000000"> </font><font color="#00007F">ifFalse:</font><font color="#000000"> </font><font color="#000000">[</font><font color="#00007F">nonZeroBlock</font><font color="#000000"> </font><font color="#00007F">value</font><font color="#000000">]</font></blockquote>

</br>
例によって NonBooleanReceiver: proceed for truth. のノーティファイアは出るものの、デバッガが立ち上がる様子はありません。つまり、せっかく定義した Integer>>#ifTrue:ifFalse: ですが、やはりコールされていないのですね。

</br>
勘の働く方ならもうおわかりでしょうが、実は Boolean のサブクラスである True や False に定義されている True>>#ifTrue:ifFalse: や False>>#ifTrue:ifFalse: も、実は今回定義した Integer>>#ifTrue:ifFalse: 同様、コールはされていなかったのです。ΩΩΩ<ナ、ナンダッテーッ!

</br>
ためしに、True>>#ifTrue:ifFalse: に Integer>>#ifTrue:ifFalse: のときと同様に self halt. を挿入してみましょう。

<blockquote>True >> <b>ifTrue:</b><font color="#000000"> </font><font color="#00007F">trueAlternativeBlock</font><font color="#000000"> </font><b>ifFalse:</b><font color="#000000"> </font><font color="#00007F">falseAlternativeBlock</font><font color="#000000"> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">self</font><font color="#000000"> </font><font color="#00007F">halt</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">^</font><font color="#00007F">trueAlternativeBlock</font><font color="#000000"> </font><font color="#00007F">value</font></blockquote>


もし、こいつが本当にコールされていたら、この時点でアウトなはずですが何も起こりませんね。念のため、明示的に True>>#ifTrue:ifFalse: をコールするコードを評価してみます。

```
true ifTrue: [#true] ifFalse: [#false]   "=> #true "
```

</br>
ふつうに #true を返してきます。がーん。

</br>
つまるところ、#ifTrue:ifFalse: をコールするメッセージ式を見つけると、コンパイラはバイトコードレベルで単なる条件分岐のコードにインライン展開してしまう仕組みがあるようです。

ちなみに今回定義した Integer>>#ifTrue:ifFalse: も、True や False の #ifTrue:ifFalse: もメソッド自体は存在しているので、動的、あるいは静的にコールすることで実行は可能です。

```
0 perform: #ifTrue:ifFalse: with: [#nonZero] with: [#zero] "動的コール"
```
```
(Integer >> #ifTrue:ifFalse:) valueWithReceiver: 0 arguments: {[#nonZero]. [#zero]} "静的コール"
```

</br>
先ほど Integer>>#ifTrue:ifFalse: に仕掛けておいた self halt. があるのでノーティファイアが出ますが、これを削除して再コンパイルした後に print it するか、あるいはそのまま Proceed すると、#zero を返してくるはずです。

</br>
なお、#ifTrue:ifFalse: のようにバイトコードレベルでインライン展開されるメソッドのセレクタは、MethodNode>>#initialize の冒頭で確認できます。

<blockquote>MethodNode >> <b>initialize</b><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007F7F">&quot;MessageNode initialize&quot;</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3F3F3F">MacroSelectors</font><font color="#000000"> </font><b>:=</b><font color="#000000"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">#(</font><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ifTrue:</font><font color="#000000"> </font><font color="#00007F">ifFalse:</font><font color="#000000"> </font><font color="#00007F">ifTrue:ifFalse:</font><font color="#000000"> </font><font color="#00007F">ifFalse:ifTrue:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">and:</font><font color="#000000"> </font><font color="#00007F">or:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">whileFalse:</font><font color="#000000"> </font><font color="#00007F">whileTrue:</font><font color="#000000"> </font><font color="#00007F">whileFalse</font><font color="#000000"> </font><font color="#00007F">whileTrue</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">to:do:</font><font color="#000000"> </font><font color="#00007F">to:by:do:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">caseOf:</font><font color="#000000"> </font><font color="#00007F">caseOf:otherwise:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">ifNil:</font><font color="#000000"> </font><font color="#00007F">ifNotNil:</font><font color="#000000">  </font><font color="#00007F">ifNil:ifNotNil:</font><font color="#000000"> </font><font color="#00007F">ifNotNil:ifNil:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">repeat</font><font color="#000000"> </font><font color="#000000">)</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3F3F3F">MacroTransformers</font><font color="#000000"> </font><b>:=</b><font color="#000000"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">#(</font><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformIfTrue:</font><font color="#000000"> </font><font color="#00007F">transformIfFalse:</font><font color="#000000"> </font><font color="#00007F">transformIfTrueIfFalse:</font><font color="#000000"> </font><font color="#00007F">transformIfFalseIfTrue:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformAnd:</font><font color="#000000"> </font><font color="#00007F">transformOr:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformWhile:</font><font color="#000000"> </font><font color="#00007F">transformWhile:</font><font color="#000000"> </font><font color="#00007F">transformWhile:</font><font color="#000000"> </font><font color="#00007F">transformWhile:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformToDo:</font><font color="#000000"> </font><font color="#00007F">transformToDo:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformCase:</font><font color="#000000"> </font><font color="#00007F">transformCase:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformIfNil:</font><font color="#000000"> </font><font color="#00007F">transformIfNil:</font><font color="#000000">  </font><font color="#00007F">transformIfNilIfNotNil:</font><font color="#000000"> </font><font color="#00007F">transformIfNotNilIfNil:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">transformRepeat:</font><font color="#000000"> </font><font color="#000000">)</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3F3F3F">MacroEmitters</font><font color="#000000"> </font><b>:=</b><font color="#000000"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">#(</font><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForWhile:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForWhile:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForWhile:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForWhile:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForToDo:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForToDo:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForCase:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForCase:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForIfNil:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForIfNil:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"> </font><font color="#00007F">emitCodeForIf:encoder:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">emitCodeForRepeat:encoder:value:</font><font color="#000000">)</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3F3F3F">MacroSizers</font><font color="#000000"> </font><b>:=</b><font color="#000000"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">#(</font><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForWhile:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForWhile:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForWhile:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForWhile:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForToDo:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForToDo:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForCase:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForCase:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForIfNil:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIfNil:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"> </font><font color="#00007F">sizeCodeForIf:value:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">sizeCodeForRepeat:value:</font><font color="#000000">)</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3F3F3F">MacroPrinters</font><font color="#000000"> </font><b>:=</b><font color="#000000"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">#(</font><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printIfOn:indent:</font><font color="#000000"> </font><font color="#00007F">printIfOn:indent:</font><font color="#000000"> </font><font color="#00007F">printIfOn:indent:</font><font color="#000000"> </font><font color="#00007F">printIfOn:indent:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printIfOn:indent:</font><font color="#000000"> </font><font color="#00007F">printIfOn:indent:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printWhileOn:indent:</font><font color="#000000"> </font><font color="#00007F">printWhileOn:indent:</font><font color="#000000"> </font><font color="#00007F">printWhileOn:indent:</font><font color="#000000"> </font><font color="#00007F">printWhileOn:indent:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printToDoOn:indent:</font><font color="#000000"> </font><font color="#00007F">printToDoOn:indent:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printCaseOn:indent:</font><font color="#000000"> </font><font color="#00007F">printCaseOn:indent:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printIfNil:indent:</font><font color="#000000"> </font><font color="#00007F">printIfNil:indent:</font><font color="#000000"> </font><font color="#00007F">printIfNilNotNil:indent:</font><font color="#000000"> </font><font color="#00007F">printIfNilNotNil:indent:</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#00007F">printRepeatOn:indent:</font><font color="#000000">)</font></blockquote>

</br>
以上、Smalltalk を例にメッセージングを解説するときの落とし穴でした。

</br>
</br>
あと、バイトコードを扱ったので、念のためにもうひとつ。

くだんのコメントで指摘した「2というオブジェクトに対して+というメッセージを3を引数に送信」という表現の誤りについてですが（Objective-C 界隈にかたくなにそう信じる宗派が存在するのはさておき）Smalltalk においてバイトコードレベルに限れば、これはあながち間違いでもなさそうです。

```
[2+3] method symbolic
```
```
25 <8F 00 00 04> closureNumCopied: 0 numArgs: 0 bytes 29 to 32
29 	<77> pushConstant: 2
30 	<22> pushConstant: 3
31 	<B0> send: +
32 	<7D> blockReturn
33 <D1> send: method
34 <D0> send: symbolic
35 <7C> returnTop
```

ちゃんと「+」というメッセージを送っているように見えますよね。;p

もちろんこれはあくまでバイトコードレベルに限った話です。オーソドックスな条件分岐があることなどから明らかなように、Smalltalk のバイトコードは、Smalltalk とは別の言語と考えるべきなので、やはり 2 + 3 をメッセージ式と解釈する場合は「 2 への + 3 というメッセージの送信」とするのが正解ですのであしからず。

</br>
追記：
どうやら #ifTrue:ifFalse: の引数（のうちどちらか）をブロックリテラルにしなければインライン展開はされずに、#ifTrue:ifFalse: をコールする普通のバイトコード列にコンパイルしてくれるようです。

```
[0 ifTrue: [#nonZero] ifFalse: [#zero] yourself] method symbolic
```
```
37 <8F 00 00 10> closureNumCopied: 0 numArgs: 0 bytes 41 to 56
41 	<75> pushConstant: 0
42 	<8F 00 00 02> closureNumCopied: 0 numArgs: 0 bytes 46 to 47
46 		<23> pushConstant: #nonZero
47 		<7D> blockReturn
48 	<8F 00 00 02> closureNumCopied: 0 numArgs: 0 bytes 52 to 53
52 		<25> pushConstant: #zero
53 		<7D> blockReturn
54 	<D4> send: yourself
55 	<F2> send: ifTrue:ifFalse:
56 	<7D> blockReturn
57 <D1> send: method
58 <D0> send: symbolic
59 <7C> returnTop
```

</br>
その根拠はこちらのメソッド（引数の両方がブロックかをチェックしている）。

<blockquote>MessageNode >> <b>transformIfTrueIfFalse:</b><font color="#000000"> </font><font color="#00007F">encoder</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">^</font><font color="#000000">(</font><font color="#7F0000">self</font><font color="#000000"> </font><font color="#00007F">checkBlock:</font><font color="#000000"> </font><font color="#007F00">(</font><font color="#000000">arguments</font><font color="#000000"> </font><font color="#00007F">at:</font><font color="#000000"> </font><font color="#7F0000">1</font><font color="#007F00">)</font><font color="#000000"> </font><font color="#00007F">as:</font><font color="#000000"> </font><font color="#7F007F">'True arg'</font><font color="#000000"> </font><font color="#00007F">from:</font><font color="#000000"> </font><font color="#00007F">encoder</font><font color="#000000"> </font><font color="#00007F">maxArgs:</font><font color="#000000"> </font><font color="#7F0000">0</font><font color="#000000">)</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;   </font><font color="#00007F">and:</font><font color="#000000"> </font><font color="#000000">[</font><font color="#007F00">(</font><font color="#7F0000">self</font><font color="#000000"> </font><font color="#00007F">checkBlock:</font><font color="#000000"> </font><font color="#7F007F">(</font><font color="#000000">arguments</font><font color="#000000"> </font><font color="#00007F">at:</font><font color="#000000"> </font><font color="#7F0000">2</font><font color="#7F007F">)</font><font color="#000000"> </font><font color="#00007F">as:</font><font color="#000000"> </font><font color="#7F007F">'False arg'</font><font color="#000000"> </font><font color="#00007F">from:</font><font color="#000000"> </font><font color="#00007F">encoder</font><font color="#000000"> </font><font color="#00007F">maxArgs:</font><font color="#000000"> </font><font color="#7F0000">0</font><font color="#007F00">)</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;   </font><font color="#00007F">and:</font><font color="#000000"> </font><font color="#007F00">[</font><font color="#000000">arguments</font><font color="#000000"> </font><font color="#00007F">do:</font><font color="#000000"> </font><font color="#7F007F">[</font><font color="#000000">:</font><font color="#00007F">arg</font><font color="#7F7F7F">|</font><font color="#000000"> </font><font color="#00007F">arg</font><font color="#000000"> </font><font color="#00007F">noteOptimizedIn:</font><font color="#000000"> </font><font color="#7F0000">self</font><font color="#7F007F">]</font><font color="#000000">.</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">true</font><font color="#007F00">]</font><font color="#000000">]</font></blockquote>