pepsi勉強中

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