2004-08-06 02:51:32 -04:00
|
|
|
#include "factor.h"
|
|
|
|
|
|
|
|
COMPLEX* complex(CELL real, CELL imaginary)
|
|
|
|
{
|
|
|
|
COMPLEX* complex = allot(sizeof(COMPLEX));
|
|
|
|
complex->real = real;
|
|
|
|
complex->imaginary = imaginary;
|
|
|
|
return complex;
|
|
|
|
}
|
|
|
|
|
|
|
|
CELL possibly_complex(CELL real, CELL imaginary)
|
|
|
|
{
|
|
|
|
if(zerop(imaginary))
|
|
|
|
return real;
|
|
|
|
else
|
|
|
|
return tag_complex(complex(real,imaginary));
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_real(void)
|
|
|
|
{
|
2004-08-12 17:36:36 -04:00
|
|
|
switch(type_of(dpeek()))
|
2004-08-06 02:51:32 -04:00
|
|
|
{
|
|
|
|
case FIXNUM_TYPE:
|
|
|
|
case BIGNUM_TYPE:
|
|
|
|
case FLOAT_TYPE:
|
|
|
|
case RATIO_TYPE:
|
|
|
|
/* No op */
|
|
|
|
break;
|
|
|
|
case COMPLEX_TYPE:
|
2004-08-12 17:36:36 -04:00
|
|
|
drepl(untag_complex(dpeek())->real);
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
default:
|
2004-08-25 00:26:49 -04:00
|
|
|
type_error(NUMBER_TYPE,dpeek());
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_imaginary(void)
|
|
|
|
{
|
2004-08-12 17:36:36 -04:00
|
|
|
switch(type_of(dpeek()))
|
2004-08-06 02:51:32 -04:00
|
|
|
{
|
|
|
|
case FIXNUM_TYPE:
|
|
|
|
case BIGNUM_TYPE:
|
|
|
|
case FLOAT_TYPE:
|
|
|
|
case RATIO_TYPE:
|
2004-08-12 17:36:36 -04:00
|
|
|
drepl(tag_fixnum(0));
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
case COMPLEX_TYPE:
|
2004-08-12 17:36:36 -04:00
|
|
|
drepl(untag_complex(dpeek())->imaginary);
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
default:
|
2004-08-25 00:26:49 -04:00
|
|
|
type_error(NUMBER_TYPE,dpeek());
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_to_rect(void)
|
|
|
|
{
|
|
|
|
COMPLEX* c;
|
2004-08-12 17:36:36 -04:00
|
|
|
switch(type_of(dpeek()))
|
2004-08-06 02:51:32 -04:00
|
|
|
{
|
|
|
|
case FIXNUM_TYPE:
|
|
|
|
case BIGNUM_TYPE:
|
|
|
|
case FLOAT_TYPE:
|
|
|
|
case RATIO_TYPE:
|
2004-08-12 17:36:36 -04:00
|
|
|
dpush(tag_fixnum(0));
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
case COMPLEX_TYPE:
|
2004-08-13 18:43:03 -04:00
|
|
|
c = untag_complex(dpop());
|
2004-08-06 02:51:32 -04:00
|
|
|
dpush(c->real);
|
2004-08-12 17:36:36 -04:00
|
|
|
dpush(c->imaginary);
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
default:
|
2004-08-12 17:36:36 -04:00
|
|
|
type_error(NUMBER_TYPE,dpeek());
|
2004-08-06 02:51:32 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_from_rect(void)
|
|
|
|
{
|
2004-08-12 17:36:36 -04:00
|
|
|
CELL imaginary = dpop();
|
2004-08-06 02:51:32 -04:00
|
|
|
CELL real = dpop();
|
|
|
|
|
|
|
|
if(!realp(imaginary))
|
|
|
|
type_error(REAL_TYPE,imaginary);
|
|
|
|
|
|
|
|
if(!realp(real))
|
|
|
|
type_error(REAL_TYPE,real);
|
|
|
|
|
2004-08-12 17:36:36 -04:00
|
|
|
dpush(possibly_complex(real,imaginary));
|
2004-08-06 02:51:32 -04:00
|
|
|
}
|