;;;generic complex (defpackage :comp ;uses generic arithmetic (:use :common-lisp :ga ) (:shadowing-import-from :ga "+" "-" "/" "*" "expt" ;binary arith "=" "/=" ">" "<" "<=" ">=" ;binary comparisons "sin" "cos" "tan" ;... more trig "atan" "asin" "acos" ;... more inverse trig "sinh" "cosh" "atanh" ;... more hyperbolic "expt" "log" "exp" "sqrt" ;... more exponential, powers "1-" "1+" "abs" "incf" "decf" "tocl" "re-intern" "numerator" "denominator" "realpart" "complex" "imagpart" ) (:export "comp" ) ) (provide "complex" ) (in-package :comp) (defstruct comp r i) ;real and imaginary parts (defmethod print-object ((a comp) stream) (format stream "~a+~a*i" (comp-r a)(comp-i a))) ;;; to do: redefine two-arg-* of complex objects in terms of two-arg-* of pieces. ;;; ;;; forbid comparison of complex objects except for = and /= (defcomparison >) (defcomparison =) (defcomparison /=) (defcomparison <) (defcomparison <=) (defcomparison >=)