Complex.st
changeset 21932 c033a3755e36
parent 21873 a2ed604af5c4
child 21933 56fbff93ec73
--- a/Complex.st	Sat Jul 01 20:15:53 2017 +0200
+++ b/Complex.st	Sat Jul 01 20:17:49 2017 +0200
@@ -75,6 +75,21 @@
 
 examples
 "
+    -25 sqrt                                  -> error
+    Complex trapImaginary:[ -25 sqrt ]        -> 5i (0.0+5.0i)
+    Complex trapImaginary:[ -25 integerSqrt ] -> 5i (0+5i)
+
+    (Complex trapImaginary:[ -5397346292805549782720214077673687804022210808238353958670041357153884304 integerSqrt ])
+        squared
+
+    1 + 3i
+
+    Number i + 1
+    1 + Number i
+
+    1i * 1i
+    Number i * Number i
+    
     (5 % 7) real
     (5 % 7) imaginary
     (5 % 7) = 5
@@ -94,6 +109,19 @@
     2 + (1 % 2)
     2 * (1 % 2)
 
+    (Number i raisedTo:-3) -> Number i
+    (Number i raisedTo:-2) -> -1
+    (Number i raisedTo:-1) -> Number i negated
+
+    (Number i raisedTo:0) -> 1
+    (Number i raisedTo:1) -> Number i
+    (Number i raisedTo:2) -> -1
+    (Number i raisedTo:3) -> Number i negated
+    (Number i raisedTo:4) -> 1
+    (Number i raisedTo:6) -> -1
+    
+    5i * 5i     -> -25
+    5i squared  -> -25 
 "
 ! !
 
@@ -200,39 +228,54 @@
      convert the root to a complex root and proceed.
      This allows for regular (failing) code to transparently convert to complex."
 
-    |send|
-
-    ^ ImaginaryResultError handle: [:ex |
-	|selector|
+    ^ ImaginaryResultError 
+        handle: [:ex |
+            |msgSend selector rcvr|
 
-	send := ex parameter.
-	selector := send selector.
-	(selector = #sqrt or: [selector = #sqrtTruncated]) ifTrue: [
-	    send receiver: send receiver asComplex.
-	    ex proceedWith: send value
-	] ifFalse: [
-	    ex reject
-	]
-    ] do: aBlock
+            msgSend := ex parameter.
+            selector := msgSend selector.
+            rcvr := msgSend receiver.
+            (selector = #sqrt or: [selector = #sqrtTruncated]) ifTrue: [
+                (rcvr isNumber and:[rcvr isReal]) ifTrue:[
+                    ex proceedWith:(rcvr abs perform:selector) i
+                ] ifFalse:[    
+                    msgSend receiver: rcvr asComplex.
+                    ex proceedWith: msgSend value
+                ].
+            ] ifFalse: [
+                (selector = #integerSqrt) ifTrue: [
+                    (rcvr isInteger) ifTrue:[
+                        ex proceedWith:(rcvr abs integerSqrt) i
+                    ] ifFalse:[
+                        ex proceedWith:(rcvr abs asComplex sqrt floor) i
+                    ].    
+                ] ifFalse: [
+                    ex reject
+                ]
+            ]
+        ] do: 
+            aBlock
 
     "
      Complex trapImaginary: [-2 sqrt]
     "
 
     "failing code:
-	 |a|
+         |a|
 
-	 a := -2.
-	 (a sqrt + 5) * 17.
+         a := -2.
+         (a sqrt + 5) * 17.
     "
     "complex code:
-	 |a|
+         |a|
 
-	 Complex trapImaginary:[
-	     a := -2.
-	     (a sqrt + 5) * 2.
-	 ]
+         Complex trapImaginary:[
+             a := -2.
+             (a sqrt + 5) * 2.
+         ]
     "
+
+    "Modified: / 01-07-2017 / 20:17:15 / cg"
 ! !
 
 !Complex methodsFor:'accessing'!