サンプルを作ってみようとid:sumimさんの自然対数の底を求めるプログラムを移植してみました。
Intervalがないのでいろいろ追加したせいで結構長くなってしまいました。
{ import: st80 } Interval : Collection (start stop step) Interval new [ self := super new. start := 0. stop := 0. step := 1. ] Interval start: aNumber [ start := aNumber ] Interval stop: aNumber [ stop := aNumber ] Interval step: aNumber [ step := aNumber ] Interval do: aBlock [ | aValue | aValue := start. step < 0 ifTrue: [ [stop <= aValue] whileTrue: [aBlock value: aValue. aValue := aValue + step] ] ifFalse: [ [stop >= aValue] whileTrue: [aBlock value: aValue. aValue := aValue + step] ] ] Integer to: aNumber [ | obj | obj := Interval new. obj start: self. obj stop: aNumber. ^ obj ] Integer factorial [ self = 0 ifTrue: [^ 1]. self > 0 ifTrue: [^ self * (self - 1) factorial]. self error: 'Not valid for negative integers' ] [ ((1 to: 12) inject: 1 into: [:e :i | e + (1 / i factorial)]) println ]
LargePositiveInteger does not understand ‘asFloat’
ということで割り算が途中でできなくなるため100でなく12で終わりです。自分で実装すればいいんですが面倒なので。
IntervalやfactorialはSqueakのもののほぼコピペです。結構あっさり動いてしまうので拍子抜けしました。