Smalltalkをかじる

フォントを16ポイントにしたい…

とりあえずフィボナッチ

x := 0. y := 1. 
10 timesRepeat: [|z| 
	z := x + y.
	x := y. 
	y := z. 
	Transcript show: x; cr]

構文エラーになるからブロックの中で改行できないのかと思ったら、DoIt(Cmd+D)する前に全部を選択していないとカーソルのある行だけ実行しようとしてカッコがミスマッチになったということだった。

browseとexploreとinspectを覚えた。

breakがないのが辛い。break的なものを作るためにはまずwhileでforを作らないといけないかな。

xs := {1. 2. 3. 4. 5}.
i := 1.
[i <= xs size] whileTrue: [
	Transcript show: (xs at: i); cr.
	i := i + 1].

1-originの罠!

= の罠! := を間違えて = にしてもUndefinedObjectが=を持っているからエラーにならなくてその後で定義しているはずのものがUndefinedってエラーになる。

ぎゃー、無限ループの止め方がわからない!

Cmd+.で止められるらしい。

あっ、detectなんてメソッドがあるじゃん!

puts := [:x | Transcript show: x; cr].
xs := {1. 2. 3. 4. 5}.

xs detect: [:x |
	puts value: x.
	x == 3.
] ifNone: [  ].

breakできた。じゃあこれで

puts := [:x | Transcript show: x; cr].
primes := OrderedCollection new.
primes add: 2; add: 3; add: 5.

(7 to: 100) do: [ :n |
	primes detect: [:p |
		n \\ p = 0.
	] ifNone: [
		puts value: n.
		primes add: n.
	]
]

100までの素数を求めることができた。ふー、とりあえず基本的な仕組みはわかったかなー。次はようやくクラスとかのあたりに手をだそう。

まとめ

  • Undefinedなエラー: 「:=が=になっている」やtypo
  • 引数の個数が違うエラー: [:x | ...]とするべきなのに[x | ...]してて引数を取らないブロックの中でxに|ってメッセージを送るという意味で文法的には間違ってない
  • foo value: barってやるべきなのにfoo :value barってやって文法エラー
  • 文の区切りはピリオドなのにセミコロンをつけてエラー
  • ブロックを}でとじててエラー
  • バックスラッシュはどうやって入力するんだ?!
  • 無限ループはCmd+.で止める
  • 7 to: 100を7..100って書いちゃうRuby
  • 識別子にアンダースコア使えないの?
  • LinkedListってオブジェクトをそのまま入れられない?代わりに何を使えばいいかわからないけどOrderedCollectionでできた!