今日気付いた Smalltalk と Ruby の(思想が)違うところ。

#(1 2 3) * #(4 5 6)    "=> #(4 10 18) "
[1, 2, 3] * [4, 5, 6]  #=> error

(0...3).collect {|i| [1, 2, 3][i] * [4, 5, 6][i]}
   #=> [4, 10, 18]
#(1 2 3) * 3    "=> #(3 6 9) "
[1, 2, 3] * 3   #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]

Array streamContents: [: s | 3 timesRepeat: [s nextPutAll: #(1 2 3)]]
   "=> #(1 2 3 1 2 3 1 2 3) "

[1, 2, 3].collect {|e| e * 3}
   #=> [3, 6, 9]
#(1 2 3) + 3    "=> #(4 5 6)"
[1, 2, 3] + 3   #=> error

[1, 2, 3].collect {|e| e + 3}
   #=> [4 5 6]
#(1 2 3) + #(4 5 6)     "=> #(5 7 9) "
[1, 2, 3] + [4, 5, 6]   #=> [1, 2, 3, 4, 5, 6]

#(1 2 3), #(4 5 6)
   "=> #(1 2 3 4 5 6) "

(0...3).collect {|i| [1, 2, 3][i] + [4, 5, 6][i]}
   #=> [5, 7, 9]

念のため、#=> で結果が示してあるのが Ruby で、"=> " が SqueakSmalltalk です。Smalltalk は " " でコメントになります。ちなみに、文字列リテラル式には ' '(シングルクオート)を使います。

で、ダブルディスパッチなんか使ってますが、基本的に Smalltalk の #Collection >> #* とか #+ の中では、上で Ruby で書いていることと同じことをしているわけです。