サンプルを作ってみようと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のもののほぼコピペです。結構あっさり動いてしまうので拍子抜けしました。