Infinity.st
author Claus Gittinger <cg@exept.de>
Tue, 17 Jun 2003 11:12:22 +0200
changeset 7385 852e84340d2b
parent 6501 51344e42c38c
child 7443 3407302dc4d9
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5287
b3b0d0e3ce98 package-definitions fixed/updated
Claus Gittinger <cg@exept.de>
parents: 1944
diff changeset
     1
"{ Package: 'stx:goodies' }"
1894
b22296ae189f Fixed is now in libbasic
Claus Gittinger <cg@exept.de>
parents: 303
diff changeset
     2
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
     3
"       NAME            infinity
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
     4
	AUTHOR          manchester
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
     5
	FUNCTION        Provides a class of infinities
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
     6
	ST-VERSION      2.2
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
     7
	PREREQUISITES   
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
     8
	CONFLICTS
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
     9
	DISTRIBUTION    world
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    10
	VERSION         1
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    11
	DATE    22 Jan 1989
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    12
SUMMARY
f014922e3b71 Initial revision
claus
parents:
diff changeset
    13
This is a set of changes that implements infinity in the Number hierarchy.  
f014922e3b71 Initial revision
claus
parents:
diff changeset
    14
I obtained the original changes from the author of an article in comp.lang.smalltalk.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    15
I have just installed it in my image and I have found two small omissions
f014922e3b71 Initial revision
claus
parents:
diff changeset
    16
which are corrected in what is below; there might be others.  Arithmetic
f014922e3b71 Initial revision
claus
parents:
diff changeset
    17
between infinities is not defined but magnitude comparisons are implemented.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    18
f014922e3b71 Initial revision
claus
parents:
diff changeset
    19
Claus: fixed some minor bugs (args to errorUndefinedResult:) and some
f014922e3b71 Initial revision
claus
parents:
diff changeset
    20
       wrong comments.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    21
       Changed retry:coercing: to match ST/X
f014922e3b71 Initial revision
claus
parents:
diff changeset
    22
"!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    23
f014922e3b71 Initial revision
claus
parents:
diff changeset
    24
!Point methodsFor: 'testing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    25
f014922e3b71 Initial revision
claus
parents:
diff changeset
    26
isFinite
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    27
	^x isFinite and: [y isFinite]!
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    28
f014922e3b71 Initial revision
claus
parents:
diff changeset
    29
isInfinite
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    30
	^x isInfinite or: [y isInfinite]! !
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    31
f014922e3b71 Initial revision
claus
parents:
diff changeset
    32
!Number methodsFor: 'testing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    33
f014922e3b71 Initial revision
claus
parents:
diff changeset
    34
isFinite
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    35
	^true!
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    36
f014922e3b71 Initial revision
claus
parents:
diff changeset
    37
isInfinite
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    38
	^false! !
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    39
f014922e3b71 Initial revision
claus
parents:
diff changeset
    40
!Number methodsFor: 'coercing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    41
f014922e3b71 Initial revision
claus
parents:
diff changeset
    42
retry: aSymbol coercing: aNumber
f014922e3b71 Initial revision
claus
parents:
diff changeset
    43
    "Arithmetic represented by the symbol, aSymbol,
f014922e3b71 Initial revision
claus
parents:
diff changeset
    44
    could not be performed with the receiver and the argument,
f014922e3b71 Initial revision
claus
parents:
diff changeset
    45
    aNumber, because of the differences in representation.  Coerce either
f014922e3b71 Initial revision
claus
parents:
diff changeset
    46
    the receiver or the argument, depending on which has higher generality, and
f014922e3b71 Initial revision
claus
parents:
diff changeset
    47
    try again.  If the symbol is the equals sign, answer false if the argument
f014922e3b71 Initial revision
claus
parents:
diff changeset
    48
    is not a Number.  If the generalities are the same, create an error message."
f014922e3b71 Initial revision
claus
parents:
diff changeset
    49
f014922e3b71 Initial revision
claus
parents:
diff changeset
    50
    |myGenerality otherGenerality|
f014922e3b71 Initial revision
claus
parents:
diff changeset
    51
f014922e3b71 Initial revision
claus
parents:
diff changeset
    52
    (aSymbol == #=) ifTrue:[
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    53
	(aNumber respondsTo:#generality) ifFalse:[^ false]
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    54
    ] ifFalse:[
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    55
	(aNumber respondsTo:#generality) ifFalse:[
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    56
	    self error:'retry:coercing: argument is not a number'.
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    57
	    ^ self
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    58
	]
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    59
    ].
f014922e3b71 Initial revision
claus
parents:
diff changeset
    60
    myGenerality := self generality.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    61
    otherGenerality := aNumber generality.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    62
    (myGenerality > otherGenerality) ifTrue:[
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    63
	^ self perform:aSymbol with:(self coerce:aNumber)
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    64
    ].
f014922e3b71 Initial revision
claus
parents:
diff changeset
    65
    (myGenerality < otherGenerality) ifTrue:[
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    66
	aNumber isInfinite ifTrue: [
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    67
	    ^ aNumber retryReverseOf:aSymbol with:self
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    68
	].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    69
	^ (aNumber coerce:self) perform:aSymbol with:aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    70
    ].
f014922e3b71 Initial revision
claus
parents:
diff changeset
    71
    self error:'retry:coercing: oops - same generality'
f014922e3b71 Initial revision
claus
parents:
diff changeset
    72
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
    73
f014922e3b71 Initial revision
claus
parents:
diff changeset
    74
Number subclass: #Infinity
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    75
	instanceVariableNames: 'positive '
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    76
	classVariableNames: 'NegativeInfinity PositiveInfinity '
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    77
	poolDictionaries: ''
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    78
	category: 'Magnitude-Numbers'!
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    79
f014922e3b71 Initial revision
claus
parents:
diff changeset
    80
Infinity comment:
f014922e3b71 Initial revision
claus
parents:
diff changeset
    81
'I have two instances representing positive and negative infinity.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    82
f014922e3b71 Initial revision
claus
parents:
diff changeset
    83
Instance Variables :-
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    84
	positive <Boolean>      :       if true the instance represents positive
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
    85
					infinity. if false, negative infinity'
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    86
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    87
6501
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    88
!Infinity class methodsFor: 'documentation'!
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    89
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    90
copyright
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    91
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    92
 This is a Manchester Goodie.  It is distributed freely on condition
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    93
 that you observe these conditions in respect of the whole Goodie, and on
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    94
 any significant part of it which is separately transmitted or stored:
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    95
	* You must ensure that every copy includes this notice, and that
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    96
	  source and author(s) of the material are acknowledged.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    97
	* These conditions must be imposed on anyone who receives a copy.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    98
	* The material shall not be used for commercial gain without the prior
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
    99
	  written consent of the author(s).
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   100
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   101
 For more information about the Manchester Goodies Library (from which 
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   102
 this file was distributed) send e-mail:
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   103
	To: goodies-lib@cs.man.ac.uk
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   104
	Subject: help 
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   105
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   106
 This is an additional goody-class, which is NOT covered by the
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   107
 ST/X license. It has been packaged with the ST/X distribution to
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   108
 make your live easier instead. NO WARRANTY.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   109
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   110
!
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   111
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   112
documentation
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   113
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   114
    This is a set of changes that implements infinity in the Number hierarchy.  
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   115
    I obtained the original changes from the author of an article in comp.lang.smalltalk.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   116
    Arithmetic between infinities is not defined but magnitude comparisons are implemented.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   117
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   118
    Claus: fixed some minor bugs (args to errorUndefinedResult:) and some wrong comments.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   119
	   Changed retry:coercing: to match ST/X
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   120
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   121
    I have two instances representing positive and negative infinity.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   122
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   123
    Instance Variables :-
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   124
	positive <Boolean>      :       if true the instance represents positive
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   125
					infinity. if false, negative infinity
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   126
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   127
!
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   128
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   129
examples
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   130
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   131
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   132
    1 + Infinity positive
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   133
    Infinity positive + 1     
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   134
    Infinity positive + Infinity positive     
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   135
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   136
    Infinity negative - 1
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   137
    Infinity negative + Infinity negative
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   138
    Infinity negative + Infinity negative
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   139
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   140
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   141
!
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   142
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   143
info
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   144
"       
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   145
	NAME            infinity
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   146
	AUTHOR          manchester
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   147
	FUNCTION        Provides a class of infinities
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   148
	ST-VERSION      2.2
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   149
	PREREQUISITES   
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   150
	CONFLICTS
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   151
	DISTRIBUTION    world
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   152
	VERSION         1
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   153
	DATE            22 Jan 1989
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   154
SUMMARY
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   155
This is a set of changes that implements infinity in the Number hierarchy.  
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   156
I obtained the original changes from the author of an article in comp.lang.smalltalk.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   157
I have just installed it in my image and I have found two small omissions
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   158
which are corrected in what is below; there might be others.  Arithmetic
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   159
between infinities is not defined but magnitude comparisons are implemented.
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   160
"
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   161
! !
51344e42c38c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5287
diff changeset
   162
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   163
!Infinity methodsFor: 'arithmetic'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   164
f014922e3b71 Initial revision
claus
parents:
diff changeset
   165
* aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   166
	"Multiply the receiver by the argument and answer with the result."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   167
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   168
	aNumber isInfinite ifTrue: [
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   169
	    self errorUndefinedResult: #*
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   170
	].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   171
	^self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   172
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   173
f014922e3b71 Initial revision
claus
parents:
diff changeset
   174
+ aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   175
	"Add the receiver by the argument and answer with the result."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   176
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   177
	(aNumber isInfinite and: [aNumber ~~ self]) ifTrue: [
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   178
	    self errorUndefinedResult: #+
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   179
	].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   180
	^self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   181
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   182
f014922e3b71 Initial revision
claus
parents:
diff changeset
   183
- aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   184
	"subtracet aNumber from the receiver answer with the result."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   185
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   186
	(aNumber isInfinite) ifTrue: [
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   187
	    self errorUndefinedResult: #-
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   188
	].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   189
	^self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   190
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   191
f014922e3b71 Initial revision
claus
parents:
diff changeset
   192
/ aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   193
	"Divide the receiver by the argument and answer with the result."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   194
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   195
	(aNumber isInfinite or: [aNumber = 0]) ifTrue: [
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   196
	    self errorUndefinedResult: #/
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   197
	].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   198
	^self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   199
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   200
f014922e3b71 Initial revision
claus
parents:
diff changeset
   201
!Infinity methodsFor: 'comparing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   202
f014922e3b71 Initial revision
claus
parents:
diff changeset
   203
< aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   204
	"Positive infinity is greater than any number than positive infinity.
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   205
	 Analogously, negative infinity is less than any other number other
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   206
	 than negative infinity"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   207
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   208
	aNumber == self ifTrue: [^false].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   209
	^ positive not!
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   210
f014922e3b71 Initial revision
claus
parents:
diff changeset
   211
= aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   212
	^aNumber == self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   213
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   214
f014922e3b71 Initial revision
claus
parents:
diff changeset
   215
!Infinity methodsFor: 'testing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   216
f014922e3b71 Initial revision
claus
parents:
diff changeset
   217
isFinite
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   218
	^false
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   219
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   220
f014922e3b71 Initial revision
claus
parents:
diff changeset
   221
isInfinite
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   222
	^true
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   223
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   224
f014922e3b71 Initial revision
claus
parents:
diff changeset
   225
!Infinity methodsFor: 'coercing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   226
f014922e3b71 Initial revision
claus
parents:
diff changeset
   227
generality
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   228
	"Infinities are more general than scalars, but not more general than
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   229
	 vectors (e.g. Points)"
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   230
	^85
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   231
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   232
f014922e3b71 Initial revision
claus
parents:
diff changeset
   233
retryReverseOf: aSymbol with: aNumber
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   234
	(aSymbol == #* or: [aSymbol == #+]) ifTrue: [
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   235
	    ^self perform: aSymbol with: aNumber
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   236
	].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   237
	(aSymbol == #/ and: [aNumber isFinite]) ifTrue: [^0].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   238
	(aSymbol == #< and: [aNumber isFinite]) ifTrue: [^positive].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   239
	(aSymbol == #> and: [ aNumber isFinite ]) ifTrue: [^positive not].
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   240
	(aSymbol == #= and: [ aNumber isFinite ])ifTrue: [ ^false ]. 
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   241
	self errorUndefinedResult: aSymbol
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   242
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   243
f014922e3b71 Initial revision
claus
parents:
diff changeset
   244
!Infinity methodsFor: 'printing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   245
f014922e3b71 Initial revision
claus
parents:
diff changeset
   246
printOn: aStream
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   247
	aStream nextPutAll: self class name.
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   248
	aStream nextPutAll:(positive
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   249
				ifTrue: [' positive']
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   250
				ifFalse: [' negative'])
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   251
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   252
f014922e3b71 Initial revision
claus
parents:
diff changeset
   253
!Infinity methodsFor: 'errors'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   254
f014922e3b71 Initial revision
claus
parents:
diff changeset
   255
errorUndefinedResult: messageName
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   256
	self error: 'Undefined result in an Infinity ', messageName
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   257
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   258
f014922e3b71 Initial revision
claus
parents:
diff changeset
   259
!Infinity methodsFor: 'private'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   260
f014922e3b71 Initial revision
claus
parents:
diff changeset
   261
setPositive: aBoolean
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   262
	positive := aBoolean
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   263
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   264
f014922e3b71 Initial revision
claus
parents:
diff changeset
   265
!Infinity class methodsFor: 'class initialization'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   266
f014922e3b71 Initial revision
claus
parents:
diff changeset
   267
initialize
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   268
	"Infinity initialize"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   269
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   270
	PositiveInfinity := self basicNew setPositive: true.
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   271
	NegativeInfinity := self basicNew setPositive: false
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   272
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   273
f014922e3b71 Initial revision
claus
parents:
diff changeset
   274
!Infinity class methodsFor: 'instance creation'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   275
f014922e3b71 Initial revision
claus
parents:
diff changeset
   276
negative
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   277
	"Return the unique instance of negative infinity"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   278
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   279
	^NegativeInfinity
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   280
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   281
f014922e3b71 Initial revision
claus
parents:
diff changeset
   282
new
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   283
	self shouldNotImplement
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   284
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   285
f014922e3b71 Initial revision
claus
parents:
diff changeset
   286
positive
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   287
	"Return the unique instance of positive infinity"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   288
303
3b550c73b036 *** empty log message ***
claus
parents: 265
diff changeset
   289
	^PositiveInfinity
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   290
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   291
f014922e3b71 Initial revision
claus
parents:
diff changeset
   292
Infinity initialize!