Ruby は Smalltalk-76 に似ている。by アラン・ケイ 2


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

▼文字オブジェクトがない

"Smalltalk-80 以降"
'abc' first         " => $a "
'abc' first class   " => Character "
"Smalltalk-76"
'abc' • 1           " => 97 "
('abc' • 1) class   " => Integer "
#ruby
"abc"[0]            # => 97
"abc"[0].class      # => Fixnum


id:sumim:20060615#p2 に続く。