読者です 読者をやめる 読者になる 読者になる

標高+1m

Make, Hack, Think

Smalltalk-72わかった気がしたのでメモ

Smalltalk

Smalltalk-80, Bits of History, Words of Advice を読んでたらムラムラしたのでSmalltalk-72のマニュアルちょこっと読んでみた。
1972年てことは今から40年前の言語なんだね!僕より21歳年上。やばい。
すごく面白かったので取り急ぎのメモ。動かしてみてないのできっとバグある。

eyeballは
quoteは #
でそれぞれ代用

"=>はif。ほんとは⇒"
cond => (then) else

"<oはアイボールって言って続くトークンを読む.ほんとは専用のグリフがある。読めたらそのトークンを食ってtrueを返す。読めなかったときはトークンを食わずにfalseを返す。"
<o someToken

"#はlispのquoteみたいなやつ。続く式を評価しない。"

"変数への代入は←。←は普通のメッセージなので変数はクオートしてやらないといけない"
#x1


"式の実行(DoIt)は!"
3 + 4!

to myclass 一時変数1 ... | インスタンス変数1 ... | クラス変数1 ... (... isnew => ...)
"でクラスmyclassを作る。変数のとこは省略できてto x temp | inst (...とかできる。
クラス名は大文字で始まるみたいなルールはなし。
コード中でmyclassが現れたらその場でインスタンスが作られる。SELFで自分自身を参照できるっぽい。"

"isnewなしだとクラスにはならず関数オブジェクトみたいに使えるっぽい"
to square n (#n ← :. ^n * n)
square 3!

"引数を受け取るには:。"
"^はreturn.メソッドの中で使う。"
(#n ← :. ^ n + 1)

これらを使うとクラスが定義できる。クラス定義

to fruit | color weight | (
  isnew => (#color'yellow')
  <o color  => (<o is => (#color ← :)  ^color) "isが続いてたらsetter違ったらgetterみたいなことできる!"
  <o weight => (<o is => (#weight ← :) ^weight)
  <o print  => ('This fruit is ' , color , ' and weighs ' , weight , 'kg.' print) "文字列結合は想像"
)!

#apple ← fruit!
apple color is 'red'!
apple color! "結果:red"
apple weight is 0.3!
apple print! "結果:This fruit is red and weighs 0.3kg."

クラス定義自体が巨大なif ... then else if ... then else if ...になってる。インスタンス生成時には擬変数isnewがtrueになるからこれがコンストラクタになる。

アイボール(