factor/native/ratio.c

50 lines
823 B
C
Raw Normal View History

2004-08-04 22:43:58 -04:00
#include "factor.h"
RATIO* ratio(CELL numerator, CELL denominator)
{
RATIO* ratio = (RATIO*)allot(sizeof(RATIO));
ratio->numerator = numerator;
ratio->denominator = denominator;
return ratio;
}
void primitive_ratiop(void)
{
check_non_empty(env.dt);
env.dt = tag_boolean(typep(RATIO_TYPE,env.dt));
}
void primitive_numerator(void)
{
switch(type_of(env.dt))
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
/* No op */
break;
case RATIO_TYPE:
env.dt = untag_ratio(env.dt)->numerator;
break;
default:
type_error(RATIO_TYPE,env.dt);
break;
}
}
void primitive_denominator(void)
{
switch(type_of(env.dt))
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
env.dt = tag_fixnum(1);
break;
case RATIO_TYPE:
env.dt = untag_ratio(env.dt)->denominator;
break;
default:
type_error(RATIO_TYPE,env.dt);
break;
}
}