factor/native/complex.c

92 lines
1.5 KiB
C
Raw Normal View History

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)
{
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:
drepl(untag_complex(dpeek())->real);
2004-08-06 02:51:32 -04:00
break;
default:
type_error(NUMBER_TYPE,dpeek());
2004-08-06 02:51:32 -04:00
break;
}
}
void primitive_imaginary(void)
{
switch(type_of(dpeek()))
2004-08-06 02:51:32 -04:00
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
case FLOAT_TYPE:
case RATIO_TYPE:
drepl(tag_fixnum(0));
2004-08-06 02:51:32 -04:00
break;
case COMPLEX_TYPE:
drepl(untag_complex(dpeek())->imaginary);
2004-08-06 02:51:32 -04:00
break;
default:
type_error(NUMBER_TYPE,dpeek());
2004-08-06 02:51:32 -04:00
break;
}
}
void primitive_to_rect(void)
{
COMPLEX* c;
switch(type_of(dpeek()))
2004-08-06 02:51:32 -04:00
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
case FLOAT_TYPE:
case RATIO_TYPE:
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);
dpush(c->imaginary);
2004-08-06 02:51:32 -04:00
break;
default:
type_error(NUMBER_TYPE,dpeek());
2004-08-06 02:51:32 -04:00
break;
}
}
void primitive_from_rect(void)
{
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);
dpush(possibly_complex(real,imaginary));
2004-08-06 02:51:32 -04:00
}