3 COMPLEX* complex(CELL real, CELL imaginary)
5 COMPLEX* complex = allot(sizeof(COMPLEX));
7 complex->imaginary = imaginary;
11 CELL possibly_complex(CELL real, CELL imaginary)
16 return tag_complex(complex(real,imaginary));
19 void primitive_complexp(void)
21 check_non_empty(env.dt);
22 env.dt = tag_boolean(typep(COMPLEX_TYPE,env.dt));
25 void primitive_real(void)
27 switch(type_of(env.dt))
36 env.dt = untag_complex(env.dt)->real;
39 type_error(COMPLEX_TYPE,env.dt);
44 void primitive_imaginary(void)
46 switch(type_of(env.dt))
52 env.dt = tag_fixnum(0);
55 env.dt = untag_complex(env.dt)->imaginary;
58 type_error(COMPLEX_TYPE,env.dt);
63 void primitive_to_rect(void)
66 switch(type_of(env.dt))
73 env.dt = tag_fixnum(0);
76 c = untag_complex(env.dt);
77 env.dt = c->imaginary;
81 type_error(COMPLEX_TYPE,env.dt);
86 void primitive_from_rect(void)
88 CELL imaginary = env.dt;
90 check_non_empty(imaginary);
91 check_non_empty(real);
94 type_error(REAL_TYPE,imaginary);
97 type_error(REAL_TYPE,real);
99 env.dt = possibly_complex(real,imaginary);
102 CELL number_eq_complex(CELL x, CELL y)
104 COMPLEX* cx = (COMPLEX*)UNTAG(x);
105 COMPLEX* cy = (COMPLEX*)UNTAG(y);
107 untag_boolean(number_eq(cx->real,cy->real)) &&
108 untag_boolean(number_eq(cx->imaginary,cy->imaginary)));
111 CELL add_complex(CELL x, CELL y)
113 COMPLEX* cx = (COMPLEX*)UNTAG(x);
114 COMPLEX* cy = (COMPLEX*)UNTAG(y);
115 return possibly_complex(
116 add(cx->real,cy->real),
117 add(cx->imaginary,cy->imaginary));
120 CELL subtract_complex(CELL x, CELL y)
122 COMPLEX* cx = (COMPLEX*)UNTAG(x);
123 COMPLEX* cy = (COMPLEX*)UNTAG(y);
124 return possibly_complex(
125 subtract(cx->real,cy->real),
126 subtract(cx->imaginary,cy->imaginary));
129 CELL multiply_complex(CELL x, CELL y)
131 COMPLEX* cx = (COMPLEX*)UNTAG(x);
132 COMPLEX* cy = (COMPLEX*)UNTAG(y);
133 return possibly_complex(
135 multiply(cx->real,cy->real),
136 multiply(cx->imaginary,cy->imaginary)),
138 multiply(cx->real,cy->imaginary),
139 multiply(cx->imaginary,cy->real)));
142 #define COMPLEX_DIVIDE(x,y) \
143 COMPLEX* cx = (COMPLEX*)UNTAG(x); \
144 COMPLEX* cy = (COMPLEX*)UNTAG(y); \
147 multiply(cy->real,cy->real), \
148 multiply(cy->imaginary,cy->imaginary)); \
151 multiply(cx->real,cy->real), \
152 multiply(cx->imaginary,cy->imaginary)); \
154 multiply(cx->imaginary,cy->real), \
155 multiply(cx->real,cy->imaginary));
157 CELL divide_complex(CELL x, CELL y)
160 return possibly_complex(divide(r,mag),divide(i,mag));
163 CELL divfloat_complex(CELL x, CELL y)
166 return possibly_complex(divfloat(r,mag),divfloat(i,mag));
169 CELL less_complex(CELL x, CELL y)
171 general_error(ERROR_INCOMPARABLE,tag_cons(cons(x,y)));
175 CELL lesseq_complex(CELL x, CELL y)
177 general_error(ERROR_INCOMPARABLE,tag_cons(cons(x,y)));
181 CELL greater_complex(CELL x, CELL y)
183 general_error(ERROR_INCOMPARABLE,tag_cons(cons(x,y)));
187 CELL greatereq_complex(CELL x, CELL y)
189 general_error(ERROR_INCOMPARABLE,tag_cons(cons(x,y)));