Fixed lots of compiler bugs. Added more primitives. Reworked interpreter
[panda.git] / st / Number.st
blob4c87c0216d7a0d6373dc54d7244c51d078bf1552
2 Copyright (c) 2008 Vincent Geddes
3 Copyright (c) 2008 Luca Bruno
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the 'Software'), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
15 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
21 DEALINGS IN THE SOFTWARE.
24 "instance creation"
26 Number classMethod!
27 new
28     self shouldNotImplement!
31 "testing"
33 Number method!
34 isNumber
35     ^ true!
37 Number method!
38 isInteger
39     ^ false!
41 Number method!
42 isSmallInteger
43     ^ false!
45 Number method!
46 isLargeInteger
47     ^ false!
49 Number method!
50 isFloat
51     ^ false!
53 Number method!
54 isFraction
55     ^ false!
57 Number method!
58 isZero
59     ^ self = self zero!
61 Number method!
62 isNegative
63     ^ self < self zero!
65 Number method!
66 isPositive
67     ^ self >= self zero!
69 Number method!
70 isStrictlyPositive
71     ^ self > self zero!
73 Number method!
74 sign
75     self < self zero ifTrue: [^ -1].
76     self > self zero ifTrue: [^  1].
77     ^ 0!
79 "intervals"
81 Number method!
82 to: stop
83     "Create an Interval between the receiver and stop"
84     ^ Interval from: self to: stop!
86 Number method!
87 to: stop by: step
88     "Create an Interval between the receiver and stop by step"
89     ^ Interval from: self to: stop by: step!
91 Number method!
92 to: stop do: aBlock
93     "Do aBlock from self to stop. Pass the counter to aBlock"
94     self to: stop by: self unity do: aBlock!
96 Number method!
97 to: stop reverseDo: aBlock
98     "Do aBlock decreasing self to stop. Pass the counter to aBlock"
99     self to: stop by: self unity reverseDo: aBlock!
101 Number method!
102 to: stop by: step do: aBlock
103     "Do aBlock increasing self to stop stepping by step. Pass the counter to aBlock"
104     | i |
105     i := self.
106     step positive
107         ifTrue: [
108             [ i <= stop ]
109                 whileTrue: [ aBlock value: i.
110                              i := i + step ] ]
111         ifFalse: [
112             [ i >= stop ]
113                 whileTrue: [ aBlock value: i.
114                              i := i + step ] ]!
116 Number method!
117 to: stop by: step reverseDo: aBlock
118     "Do aBlock decreasing self to stop stepping by step. Pass the counter to aBlock"
119     | i |
120     i := self.
121     step positive
122         ifTrue: [
123             [ i >= stop ]
124                 whileTrue: [ aBlock value: i.
125                              i := i - step ] ]
126         ifFalse: [
127             [ i <= stop ]
128                 whileTrue: [ aBlock value: i.
129                              i := i - step ] ]!
132 "coercing"
134 Number method!
135 asFraction
136     ^ Fraction numerator: self denominator: 1!
138 Number method!
139 zero
140     ^ self subclassResponsibility!
142 Number method!
143 generality
144     self subclassResponsibility!
146 Number method!
147 unity
148     self subclassResponsibility!
150 Number method!
151 coerce: aNumber
152     ^ aNumber!
155 "arithmetic"
157 Number method!
158 negated
159     self ~= self zero
160                 ifTrue: [ ^self zero - self ]!
162 Number method!
164     self < self zero
165                 ifTrue: [ ^ self negated ]
166                 ifFalse: [ ^ self ]!
168 Number method!
169 reciprocal
170     "Answer the reciprocal number of self"
171     ^ 1 / self!
173 Number method!
174 + aNumber
175     "Coerce aNumber and do the sum"
176     ^ self generality > aNumber generality
177                 ifTrue: [ self + (self coerce: aNumber) ]
178                 ifFalse: [ (aNumber coerce: self) + aNumber ]!
180 Number method!
181 - aNumber
182     "Coerce aNumber and do the difference"
183     ^ self generality > aNumber generality
184                 ifTrue: [ self - (self coerce: aNumber) ]
185                 ifFalse: [ (aNumber coerce: self) - aNumber ]!
187 Number method!
188 * aNumber
189     "Coerce aNumber and do multiplication"
190     ^ self generality > aNumber generality
191                 ifTrue: [ self * (self coerce: aNumber) ]
192                 ifFalse: [ (aNumber coerce: self) * aNumber ]!
194 Number method!
195 / aNumber
196     "Coerce aNumber and do division"
197     aNumber isZero
198         ifTrue: [ self zeroDivide ].
200     ^ self generality > aNumber generality
201         ifTrue: [ self / (self coerce: aNumber) ]
202         ifFalse: [ (aNumber coerce: self) / aNumber ]!
204 Number method!
205 // aNumber
206     "Do division then answer the quotient floor"
207     ^ (self / aNumber) floor!
209 Number method!
210 \\ aNumber
211     "Coerce aNumber and do modulo"
212     ^ self generality > aNumber generality
213                 ifTrue: [ self \\ (self coerce: aNumber) ]
214                 ifFalse: [ (aNumber coerce: self) \\ aNumber ]!
216 Number method!
217 quo: aNumber
218     "Do division then answer the truncated quotient towards zero"
219     ^ (self / aNumber) truncated!
221 Number method!
222 rem: aNumber
223     "Do division then answer the truncated remainder towards zero"
224     self notYetImplemented!
227 "comparing"
229 Number method!
230 compare: aNumber
231     "Return 1 if self > aNumber, 0 if = aNumber, -1 if < aNumber"
232     self > aNumber ifTrue: [ ^ 1 ].
233     self = aNumber ifTrue: [ ^ 0 ].
234     self < aNumber ifTrue: [ ^ -1 ]!
236 Number method!
237 < aNumber
238     "Coerce aNumber and compare"
239     ^ self generality > aNumber generality
240                 ifTrue: [ self < (self coerce: aNumber) ]
241                 ifFalse: [ (aNumber coerce: self) < aNumber ]!
243 Number method!
244 > aNumber
245     "Coerce aNumber and compare"
246     ^ self generality > aNumber generality
247                 ifTrue: [ self > (self coerce: aNumber) ]
248                 ifFalse: [ (aNumber coerce: self) > aNumber ]!
250 Number method!
251 <= aNumber
252     "Coerce aNumber and compare"
253     ^ self generality > aNumber generality
254                 ifTrue: [ self <= (self coerce: aNumber) ]
255                 ifFalse: [ (aNumber coerce: self) <= aNumber ]!
257 Number method!
258 >= aNumber
259     "Coerce aNumber and compare"
260     ^ self generality > aNumber generality
261                 ifTrue: [ self >= (self coerce: aNumber) ]
262                 ifFalse: [ (aNumber coerce: self) >= aNumber ]!
264 Number method!
265 = aNumber
266         [ ^ false ] value.
268     "Coerce aNumber and compare equality"
269     aNumber isNumber
270                 ifFalse: [ ^ false ].
271     ^ self generality > aNumber generality
272                 ifTrue: [ self = (self coerce: aNumber) ]
273                 ifFalse: [ (aNumber coerce: self) = aNumber ]!
275 Number method!
276 ~= aNumber
277     "Coerce aNumber and compare inequality"
278     ^ self generality > aNumber generality
279                 ifTrue: [ self ~= (self coerce: aNumber) ]
280                 ifFalse: [ (aNumber coerce: self) ~= aNumber ]!
284 "signaling"
286 Number method!
287 zeroDivide
288     self notYetImplemented!
291 "mathematics"
293 Number method!
295     self notYetImplemented!
297 Number method!
299     self notYetImplemented!
301 Number method!
302 log: aNumber
303     self notYetImplemented!
305 Number method!
306 floorLog: radix
307     self notYetImplemented!
309 Number method!
310 raisedTo: aNumber
311     self notYetImplemented!
313 Number method!
314 raisedToInteger: anInteger
315     self notYetImplemented!
317 Number method!
318 sqrt
319     self notYetImplemented!
321 Number method!
322 squared
323     "Answer the square of the receiver"
324     ^ self * self!
326 "printing"
327 Number method!
328 printString
329         ^ self printStringRadix: 10!