Smalltalk-76(-78)のArrayのAPIが思ったよりSmalltalk-80と違っていて面白かったので、気付いた範囲でいくつか拾ってみた


x .

"at:put:, yourself" ↪(1 2 3) ◦ 2 ← 100; itself "⇒ (1 100 3 ) ".
"atLast:put:" ↪(1 2 3) last ← 100; itself "⇒ (1 2 100 ) ".
"replaceFrom:to:with:" ↪(1 2 3 4 5 6) ◦ (2 to: 3) ← ↪(20 30); itself "⇒ (1 20 30 4 5 6 ) ".
"size" (1 to: 10) length "⇒ 10 ".
"includes:" (1 to: 10) has: 5 "⇒ true ".
"collect:" (1 to: 10) transform▹ x to▹ [x * 2] "⇒ (2 4 6 8 10 12 14 16 18 20 ) ".
"select:" (1 to: 10) all▹ x suchThat▹ [x \ 2 ≡ 0] "⇒ (2 4 6 8 10 ) ".
"detect:" (1 to: 10) find▹ x suchThat▹ [x > 3] "⇒ 4 ".
"inject: 0 into: #+" (1 to: 10) sumTo: 100 "⇒ 155 ".
"asBag sortedCounts" ↪(1 1 2 3 3 3 4 5 5) frequencies "⇒ ((1 4 ) (1 2 ) (2 1 ) (2 5 ) (3 3 ) ) ".

http://squab.no-ip.com/collab/uploads/st80-vs-st76.png

“▹”は白抜きの“:”(オープンコロン。件のエミュレーターでは : を二回タイプして入力できる。ちなみに“◦”は . を二回、↪ は # )。上のテキストを Smalltalk-78 のワークスペース(デスクトップ右クリック → open workspace )などにペーストして使用可能です( ctrl + v 。ホストOS とブラウザの組み合わせによって機能しないことがあります。当方は Win8.1 + Chrome を使用)。変数 x を使用する式は冒頭の | x. から評価してみたい行の最後のピリオドの手前まで(つまり、最後のピリオドを選択範囲に含めない)、変数 x は特に使用しない式なら行の頭からやはりピリオドの手前まで選択して右クリック → doit すると実行、結果の表示ができます。

Ruby にも同一メソッドの別名の一方として採用されている #collect: 、#select: 、#detect: 、#inject:into: などのいわゆる 〜ect系は Smalltalk-76(-78) にはまだなくて、比較的のちの Smalltalk-80 になって取り入れられたものなのですね。


こういう面白い機能も見つけました。UserView の同名メソッドを介して、ウインドウのアクティベート等に使われたようです。のちの MVC の ControlManager では OrderedCollection で remove: してから addFirst: するイデオムに置き換えられていました。


↪(1 2 3 4 5) promote: 3 "⇒ (3 1 2 4 5 ) ".


Smalltalk-72、-76、-80 という三世代の Smalltalk の文法の変化も面白いですが、比較的よく似ている -76(-78) から -80 への API の変化を追いかけるのも楽しそうですね。



▼おまけ

Smalltalk-72
https://pbs.twimg.com/media/Cb5th-0UYAAosCT.png


Smalltalk-76(-78)
https://pbs.twimg.com/media/Cb5tiCWUcAI9jVp.png


Smalltalk-80
https://pbs.twimg.com/media/CcBaiNkUcAAwF-f.png