« 連載: Smalltalk use: better《13》true/false が Boolean だったら | トップページ | 連載: Smalltalk use: better《15》そして True/False が生まれる »

2006年5月25日 (木)

連載: Smalltalk use: better《14》true/false が Boolean でないのは

キーワード ◆ 3+4・Boolean・False・hello world・ifTrue:・ifTrue:ifFalse:・not・True

※ PDF でご覧になるなら ⇒ 「piyo60525.pdf」をダウンロード

------------ 序 ------------

失敗ですって。失敗なんかしてないわ。 
まだ成功してないだけよ。

"Slack", Tom DeMarco

◆ 生まれて初めての Smalltalk プログラミング。世界で最も有名なプログラムと言えば "hello world" を表示させることでしょうか。では、Smalltalk の場合にも、やはり "hello world" なのでしょうか。そうとは限りません。ここで "3+4" を実行してみるのが、お洒落なところです。個人的な意見ですが、これが Smalltalker の嗜みというものです。

この次はもっとうまく失敗しましょう。
もしそれがたまたま成功したら、ラッキーじゃないの。

小泉ひよ子・談

◆ Workspace に 3+4 と入力して do it すると、そこにはちゃんと "7" が現れるではありませんか。感激のあまり (@_@); うるうる。あらそんな冷やかな目で、私を見ないで…。だったら "3+4=7" を証明してみせましょう。その詳細は "Computer Today," 1995/11 をご覧ください。

------------ 本文 ------------

ifTrue := [:bool :block |
    bool ifTrue: [block value] ifFalse: []].
ifTrue value: true value: [3 factorial].          "6" 
ifTrue value: false value: [3 factorial].          "nil"

true ifTrue: [3 factorial]          "6"   
false ifTrue: [3 factorial]          "nil"

60525a_2 ◆ メッセージ ifTrue: に相当するブロック ifTrue を用意します。すると、メッセージ式 ifTrue value: true value: [3 factorial] は、true ifTrue: [3 factorial] に相当します。

◆ まず、クラス Boolean で実現する場合について考えます。(1)ブロック引数 bool は、Boolean のインスタンスと仮定した true/false を束縛します。(2)bool が参照するオブジェクトに、ifTrue:ifFalse: を伴うメッセージを送ります。(3)true なら、ブロック引数 block が束縛するブロックを評価します。(4)false なら、nil をリターンオブジェクトとします。

ifTrue := [:block | block value].
ifTrue value: [3 factorial].          "6"

60525c_1 ◆ 次に、クラス True で実現する場合について考えます。このとき、false について考慮する必要はありません。なぜなら、true が、そのクラスの唯一のインスタンスだからです。すると、メッセージ value: [3 factorial] を受け取ったときに、単に、ブロック式を評価するだけとなります。

ifFalse := [:bool :block |
    bool ifTrue: [] ifFalse: [block value]].
ifFalse value: true value: [3 factorial].          "nil" 
ifFalse value: false value: [3 factorial].          "6" 

true ifFalse: [3 factorial]          "nil"   
false ifFalse: [3 factorial]          "6"

60525b_2 ◆ メッセージ ifFalse: に相当するブロック ifFalse を用意します。すると、メッセージ式 ifFalse value: true value: [3 factorial] は、true ifFalse: [3 factorial] に相当します。

◆ まず、クラス Boolean で実現する場合について考えます。(1)ブロック引数 bool は、Boolean のインスタンスと仮定した true/false を束縛します。(2)bool が参照するオブジェクトに、ifTrue:ifFalse: を伴うメッセージを送ります。(3)true なら、nil をリターンオブジェクトとします。(4)false なら、ブロック引数 block が束縛するブロックを評価します。

ifFalse := [:block | nil].
ifFalse value: [3 factorial].          "nil"

60525d_1 ◆ 次に、クラス False で実現する場合について考えます。このとき、true について考慮する必要はありません。なぜなら、false が、そのクラスの唯一のインスタンスだからです。すると、メッセージ value: [3 factorial] を受け取ったときに、単に、リターンオブジェクト nil を用意するだけとなります。

==================================
真樹育未 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

|

« 連載: Smalltalk use: better《13》true/false が Boolean だったら | トップページ | 連載: Smalltalk use: better《15》そして True/False が生まれる »

Squeak/Smalltalk」カテゴリの記事

.連載: Smalltalk use: better」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《14》true/false が Boolean でないのは:

« 連載: Smalltalk use: better《13》true/false が Boolean だったら | トップページ | 連載: Smalltalk use: better《15》そして True/False が生まれる »