id:sumim:20060613#p1 の続き。Smalltalk-76 の勉強を兼ねて、Smalltalk-76 が Ruby に似ているっぽいところを列挙しています。
▼制御構造の書き方
Smalltalk-80 以降では、条件分岐や繰り返しなどの制御構造もすべて、しかるべきレシーバに対するメッセージ送信として記述します(少なくとも見た目は…。実際はコンパイル時にインライン展開されて、通常の制御構造文として解釈、実行)。しかし、Smalltalk-76 では Ruby 同様、メッセージ式ではない、専用の構文ライクな特別な式を用います。
条件分岐
"Smalltalk-80 以降では、通常のメッセージ式で" 3 < 4 ifTrue: [5] ifFalse: [6]
"Smalltalk-76" if% 3 < 4 then% [5] else% [6] 3 < 4 ? [5] 6
#ruby if 3 < 4 then 5 else 6 end 3 < 4 ? 5 : 6
繰り返し: パラメータを 1(もしくは 0)から 1 ずつ増やしながら指定回数
"Smalltalk-80 以降にはないので、配列や数値へのメッセージ送信で代用" (1 to: 10) do: [:i | Transcript cr; show: i] " 1 から 10 までを出力。配列へ送信 " 1 to: 10 do: [:i | Transcript cr; show: i] " 1 へ送信するバージョン "
"Smalltalk-76" for% i to: 10 do% [user show: i; cr] " 1 から 10 までを出力 "
#ruby for i in 0...10 do p i end # 0 から 9 までを出力 10 times {|i| p i} # ブロック付きメソッドで
繰り返し: パラメータを指定した配列の要素で
"Smalltalk-80 以降では配列への、ブロックを引数として添えたメッセージ送信で" #('a' 'b' 'c') do: [:str | Transcript cr; show: str] " 'a'、'b'、'c' を表示 "
"Smalltalk-76" for% str from: ('a', 'b', 'c') do% [user show: str; cr] " 'a'、'b'、'c' を表示 "
#ruby for str in ["a", "b", "c"] do p str end # "a", "b", "c" を表示 ["a", "b", "c"].each {|str| p str} # ブロック付きメソッドでも
繰り返し: 条件付き繰り返し
"Smalltalk-80 以降ではブロックに対するメッセージ送信で" | n | n := 0. [(n := n + 1) < 10] whileTrue: [Transcript cr; show: n]. [(n := n - 1) = 0] whileFalse: [Transcript cr; show: n]
"Smalltalk-76" n ← 0. while% (n ← n + 1) < 10 do% [user show: n; cr]. until% (n ← n - 1) = 0 do% [user show: n; cr]
#ruby n = 0 while (n += 1) < 10 do p n end until (n -= 1) == 0 do p n end